在这里了解问题。我正在建立一个MERN设置网站,并且正在像这样更新数据库中的字段:
router.post("/updateLogApprovementStatus", (req, res) => {
User.findOneAndUpdate(
{ _id: req.body.userId },
{ $set: { log: req.body.newData } }
).then(user => res.json(user.log));
});
但是在使用正确的数据反复调用api之后,我的数据字段没有更新。但是,当我这样做时:
router.post("/updateLogApprovementStatus", (req, res) => {
User.findOneAndUpdate(
{ _id: req.body.userId },
{ $set: { log: req.body.newData } }
).then(user => res.json(user.log));
});
我的数据库更新非常好。我所做的只是添加了一个res.json(),它在更新后出现,因为它位于“ then”语句中,这让我想知道为什么它很麻烦。 我很确定我所做的只是添加了res.json()语句。关于为什么使它起作用的任何澄清?
答案 0 :(得分:1)
原因是:"The query executes if callback is passed else a Query object is returned."(在退货部分下方)
.then()
并不是真正的承诺,它被猫鼬伪装起来,但起到了执行的作用。
您可以看到它执行查询 here
.exec()
来自 documentation“执行查询”并返回一个 Promise(真实的)
Mongoose 查询不是承诺。他们有一个 .then() 函数用于 co 和 async/await 为方便起见。如果你需要一个成熟的承诺, 使用 .exec() 函数。
答案 1 :(得分:0)
如果我正确理解了您的问题,则应使用类似以下的内容:
User.findOneAndUpdate(
{ _id: req.body.userId },
{ $set: { log: req.body.newData } }
).exec();
exec函数将运行查询,这样您就不必处理承诺结果。