为什么除非在findOneAndUpdate之后调用“ .then res.json(...)”,否则MongoDB不会更新?

时间:2019-04-27 23:27:27

标签: mongodb mongoose mern

在这里了解问题。我正在建立一个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()语句。关于为什么使它起作用的任何澄清?

2 个答案:

答案 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函数将运行查询,这样您就不必处理承诺结果。