我目前正试图在node.js-项目中实现更新/放置功能,但我完全不知道这是从何而来。(我也是JS初学者)。我用的是快递,MongoDB和猫鼬。
问题在于这种方法(或我如何称呼它):
User.findOne({ userID: searchUserID })
该方法的Kontext,即称为:
/* 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*/})
}
当我从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 */})
})
那一切都很好。
但是,当我想从同一个模块(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 */
}
然后我得到一个错误,因为‘用户’是没有定义的。
显然,User.findOne({ userID: searchUserID })
在第一种情况下工作,并返回一个用户。但这在第二种情况下行不通。
我使用调试器来检查在调用findOne函数时传递的参数。
第一个参数是: searchUserID
其价值是:“曼弗雷德”
第二个参数是回调函数,但它并不是那么远。
第一个参数完全相同,无论我是直接从UserRoute.js
还是从UserService.js
调用它。
在这两种情况下,我还比较了“查询”对象的内容。它有3700多条线,它们在10条线上有差异.一些我不明白的很长的数字。可能是随机数,timeStamps或...I确实毫无头绪(但如果有人需要它们,我可以再查一次)。
为什么User.findOne({ userID: searchUserID })
在第二种情况下不起作用?
编辑:我的全部功能(不使用“内容”缩短它们)
在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
};
})
}
这一项尚未完成,但这是继以下几项之后提出的:
// 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)
}
})
}
在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" + [])
}
})
})
发布于 2022-05-07 22:06:09
您需要将req.params.userID转换为对象Id,例如:
Types.ObjectId(req.params.uuid)
也是进口类型
import { Types } from 'mongoose'
发布于 2022-05-07 23:16:23
它无法工作,因为您尝试访问数据,而仍然从DB获取数据。
我的观点是:不要使用回调,它们已经很老了,你迟早会陷入回调的地狱。猫鼬支持承诺。重写您的代码:
function findUserBy(searchUserID) {
logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
return User.findOne({ userID: searchUserID }).exec()
}
如果不提供回调,则函数将向null
或用户返回承诺。
让我们重写一下您的路由器:
router.get('/:userID', async function (req, res, next) {
let user = await userService.findUserBy(req.params.userID)
console.log(user)
})
我用它做了一个async / await
。await
只在异步函数中工作,可以等待承诺。
如果你现在这么做:
async function updateUser(userID, newUserData) {
let user = await findUserBy(userID)
if(!user) {
console.log("no user found")
}
let id = user.body.id
/* more content */
}
你应该看到一些结果。我使updateUser
成为一个异步函数。所以你可以使用await
。但小心点。异步函数返回一个承诺,因此您还需要在它们上使用await
。
如果您曾经将回调看作第二个参数,那么它的大部分时间都是异步代码。
编辑代码:
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);
}
});
https://stackoverflow.com/questions/72156655
复制相似问题