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



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

原因是

:"如果传递回调,则执行查询,否则返回查询对象。

.then()并不是真正的承诺,它被猫鼬伪装成,但起到了处决的作用。

您可以在此处看到它执行查询

.exec()自文档"执行查询"并返回一个承诺(真值(

猫鼬查询不是承诺。他们有一个 .then(( 函数用于 co和异步/等待为方便。如果您需要一个成熟的承诺,使用 .exec(( 函数。

如果我正确理解您的问题,您应该使用这样的事情:

User.findOneAndUpdate(
  { _id: req.body.userId },
  { $set: { log: req.body.newData } }
).exec();

exec 函数将运行查询,这样您就不必处理承诺结果。

最新更新