[英]How to use User.findOne({ userID: searchUserID } correctly ??? (currently not getting return value)
I am currently trying to implement an update / put functionality in my node.js-project and having issues I have absolutely no clue, where that comes from.我目前正在尝试在我的 node.js-project 中实现更新/放置功能,并且遇到了我完全不知道的问题,这是从哪里来的。 (also I am a JS beginner).
(我也是 JS 初学者)。 I am using express, MongoDB and mongoose.
我正在使用快递、MongoDB 和猫鼬。
Problem is in this method (or how I call it):问题在于这种方法(或者我如何称呼它):
User.findOne({ userID: searchUserID })
Kontext of the the method, that is called:该方法的上下文,称为:
/* find User by userID */
// calling sequence: UserService > findUserBy() callback
function findUserBy(searchUserID, callback) {
logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
let query = User.findOne({ userID: searchUserID })
query.exec(function (err, user) {/*content*/})
}
When I call it directly from the UserRoute module like this:当我像这样直接从 UserRoute 模块调用它时:
/* get one user */
// calling sequence: UserRoute > router.get('/:userID') callback > userService.findUserBy() callback
router.get('/:userID', function (req, res, next) {
userService.findUserBy(req.params.userID, function (err, user) {/* content */})
})
then it all works fine.然后一切正常。
But when I want to use that function from another function inside the same module ( UserService
):但是当我想从同一个模块(
UserService
)内的另一个函数中使用该函数时:
/* update one User */
// calling sequence: UserService > updateUser > findUserBy() callback
function updateUser(userID, newUserData, callback) {
findUserBy(userID, function (err, user) {...})
let id = user.body.id
/* more content */
}
Then I am getting an error, since 'user' is not defined.然后我收到一个错误,因为未定义“用户”。
Obviously User.findOne({ userID: searchUserID })
is working in the first case and returns a user.显然
User.findOne({ userID: searchUserID })
在第一种情况下工作并返回一个用户。 But it is not working in the second case.但它不适用于第二种情况。
I have used the debugger to check the parameters, that are delivered when calling the findOne function.我使用调试器检查了调用 findOne 函数时传递的参数。
The 1st parameter is: searchUserID第一个参数是:searchUserID
and the value is: 'manfred'值是:'manfred'
The 2nd parameter is a callback function, but it doesn't come this far anyway.第二个参数是一个回调函数,但它并没有走到这一步。
The first parameter is exactly the same, no matter whether I call it directly from UserRoute.js
or the UserService.js
.第一个参数完全一样,不管我是直接从
UserRoute.js
调用还是从UserService.js
调用。
I have also compared the content of the 'query'-objects in both cases.我还比较了这两种情况下“查询”对象的内容。 It has a bit more then 3700 lines and they have differences in like 10 lines... some veeeery long numbers that I don't understand.
它有超过 3700 行,它们之间的差异大约有 10 行……一些我不明白的长数字。 Probably random Numbers, timeStamps or ...I really have no clue (but if someone needs them I can look them up again).
可能是随机数字、时间戳或......我真的不知道(但如果有人需要它们,我可以再次查找它们)。
Why is User.findOne({ userID: searchUserID })
not working in the second case?为什么
User.findOne({ userID: searchUserID })
在第二种情况下不起作用?
EDIT : my full functions (without shortening them with 'content)编辑:我的全部功能(没有用'内容缩短它们)
in UserService.js
:在
UserService.js
中:
//find User by userID
function findUserBy(searchUserID, callback) { //UserService > findUserBy() callback
logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
let query = User.findOne({ userID: searchUserID }) // query object erstellen
query.exec(function (err, user) { //query wird asynchron ausgeführt
if (err) {
logger.error(err.message)
return callback(err.message) // callback übergibt fehlernachricht
}
if (user) { // hier wirkt null wie false
logger.debug(`Found userID: ${searchUserID}`)
callback(null, user)
}
else {
//logger.error("Did not find user for userID: " + searchUserID)
callback(`Did not find user with userID: ${searchUserID}`, user) // callback übergibt fehlernachricht
};
})
}
This one is not done yet, but that comes after:这个还没有完成,但是之后:
// update User
function updateUser(userID, newUserData, callback) {
logger.debug(`Updating user '${userID}'...`)
findUserBy(userID, function (err, user) { //UserService>updateUser>findUserBy() callback
if (user) {
logger.debug(user)
(null, user.body)
}
else {
logger.error(err)
return console.log("Did not find any User with this userID" + [], null)
}
})
//logger.debug("user:" + user, err)
console.log("so far so good...")
let id = user.body.id
let user = new User()
Object.assign(user, user.body)
Object.assign(user, newUserData)
user.body.id = id
user.save(function (err) {
if (err) {
logger.debug("Could not create user account: " + err)
return callback("Could not create user account", null)
}
else {
callback(null, user)
}
})
}
in UserRoute.js
:在
UserRoute.js
中:
/* update one User */
router.put('/:userID', function (req, res, next) {
userService.updateUser(req.params.userID, req, function (err, user) {
if (user) {
//res.send(Object.assign(user))
logger.debug(user)
res.send(`User ${req.body.userID} sucessfully updated. \r\r new Json-Body: \r ` + user)
}
else {
logger.error(err)
res.send("Did not find any User with this userID" + [])
}
})
})
/* get one user */
router.get('/:userID', function (req, res, next) {
userService.findUserBy(req.params.userID, function (err, user) { //UserRoute > router.get('/:userID') callback > userService.findUserBy() callback
if (user) {
res.send(user)
logger.debug(user)
//res.json(user)
}
else {
logger.error(err)
res.send("Did not find any User with this userID" + [])
}
})
})
you need to convert req.params.userID to an object Id For eg :您需要将 req.params.userID 转换为对象 ID 例如:
Types.ObjectId(req.params.uuid)
also Import Types还导入类型
import { Types } from 'mongoose'
It does not work because you try to access the data while you still fetching it from the DB.它不起作用,因为您在仍然从数据库中获取数据的同时尝试访问数据。
My opinion: Dont use callbacks, they are pretty old and you will sooner or later land into an callback hell.我的观点:不要使用回调,它们已经很老了,你迟早会陷入回调地狱。 Mongoose supports Promises.
Mongoose 支持 Promise。 Rewrite your code a bit:
稍微重写你的代码:
function findUserBy(searchUserID) {
logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
return User.findOne({ userID: searchUserID }).exec()
}
If you not provide an callback, your function will return an promise with either null
or your user.如果您不提供回调,您的函数将返回一个带有
null
或您的用户的 Promise。
Lets rewrite your router a bit:让我们稍微重写一下你的路由器:
router.get('/:userID', async function (req, res, next) {
let user = await userService.findUserBy(req.params.userID)
console.log(user)
})
I made an async / await
out of it.我做了一个
async / await
。 await
only works in an async function and can await Promises. await
仅适用于异步函数,并且可以等待 Promises。
If you do this now:如果你现在这样做:
async function updateUser(userID, newUserData) {
let user = await findUserBy(userID)
if(!user) {
console.log("no user found")
}
let id = user.body.id
/* more content */
}
You should see some result.你应该看到一些结果。 I made
updateUser
an async function.我将
updateUser
异步函数。 So you can use await
.所以你可以使用
await
。 But watch out.但要小心。 Async function returns an promise, so you will also need to use
await
on them.异步函数返回一个 Promise,因此您还需要在它们上使用
await
。
If you ever see an callback as second argument, then its most of the time asynchronouse code.如果您曾经将回调视为第二个参数,那么它大部分时间都是异步代码。
Edited code:编辑代码:
function findUserBy(searchUserID) {
return User.findOne({ userID: searchUserID }).exec(); // query object erstellen
}
async function updateUser(userID, newUserData) {
let user = await findUserBy(userID);
if (!user) throw "Cannot find user";
let newUser = new User({ ...user.body, ...newUserData });
return newUser.save();
}
/* update one User */
router.put("/:userID", async function(req, res, next) {
try {
let user = await userService.updateUser(req.params.userID, req.body);
res.status(200).json(user);
} catch (err) {
res.status(404).json("Did not find any User with this userID" + []);
}
});
/* get one user */
router.get("/:userID", async function(req, res, next) {
try {
let user = await userService.findUserBy(req.params.userID);
if (!user)
return res
.status(404)
.send("Did not find any User with this userID" + []);
return res.status(200).json(user);
} catch (err) {
return res.status(500).json(err);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.