代码之家  ›  专栏  ›  技术社区  ›  SwimmingG

Mongoose findOneAndUpdate按不同顺序返回参数

  •  0
  • SwimmingG  · 技术社区  · 8 年前

    我目前正在与猫鼬合作,我遇到了一些我觉得很奇怪的事情。

    我的代码如下:

          Challenge.findOneAndUpdate({ _id: req.params.challengeId, users: req.user._id }, { $push: { submissions: submission._id } }, { new: true })
          .then(function(err, challengeUpdated) {
            console.log(challengeUpdated);
            console.log(err);
            if (err) {
              console.log('The error is : ');
              console.log(err);
              return res.status(401).json({ message: 'Error saving submission' });
            }
             else {
              return res.json(submission);
            }
          })

    注意我是如何 function(err, challengeUpdated) ,在此处的文档中: http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate ,它说应该是这样的,但当我记录它们时 err 打印对象,challengeUpdated打印未定义/空。改变周围的参数似乎是我的黑客行为,所以我想知道这里是否有明显的错误。

    注:有可能 req.user._id 不在里面 users 。这就是我要找出的错误。

    查看此问题的答案: Mongoose: findOneAndUpdate doesn't return updated document ,答案似乎和我一样。

    希望其他人面对这个问题?

    注意:我使用的是mongoose v5.5.1。

    1 回复  |  直到 8 年前
        1
  •  2
  •   nicholaswmin    8 年前

    您的问题是您正在使用 error-first callback arguments 在基于承诺的代码中。

    使用时应该是这样 Promise 接口:

    Challenge.findOneAndUpdate({ _id: req.params.challengeId, users: req.user._id }, { $push: { submissions: submission._id } }, { new: true })
      .then((challengeUpdated) => {
        console.log('Success!')
        console.log(challengeUpdated)
      })
      .catch((err) => {
        console.error('An error occured', err)
      })
    

    function(err, result) { } 是为回调样式代码保留的模式,而不是为承诺保留的模式。