猫鼬findOneAndUpdate首先返回两次,且null为空?

时间:2018-11-29 10:34:05

标签: node.js mongoose

这是我的代码:

router.post('/update_todo', async (req, res) => {
  const { todoId, userId, complete } = req.body;
  try {
    const todo = await Todo.findOneAndUpdate(
      { _id: todoId, userId },
      { $set: { complete: !complete } },
      { new: true } // return latest
    ).populate('userId', '_id');
    console.log('todo pdated', todo)
    res.json({ todo })
  } catch (error) {
    res.status(400).json({ error })
  }
})

当我尝试登录时,它返回了两次?

todo pdated null
todo pdated { complete: true,
_id: 5c003223ec8c1350b8c77b4f,
text: 'wearasdasd asd 2222',
userId: { _id: 5bf3b0b676bcc8176422e94e },
createdAt: 2018-11-29T18:38:27.156Z,
updatedAt: 2018-11-29T23:31:57.022Z,
__v: 0 }

是什么原因导致我使用异步/等待时此代码返回两次?

2 个答案:

答案 0 :(得分:0)

尝试:

router.post('/update_todo', async (req, res) => {
  const { todoId, userId, complete } = req.body;
  try {

      Todo.findOneAndUpdate({_id: todoId,userId:userId},{$set:{complete: !complete}}, {new: true}, (err, doc) => {
        if (err) {
        console.log("Something wrong when updating data!");
        }
        console.log('todo updated', doc)
        res.json({ doc })
     });

} catch (error) {
    res.status(400).json({ error })
  }
})

答案 1 :(得分:0)

我有一个猜测,尽管您的问题缺少足够的数据来确保:我不认为这与async / await有关,但是您的代码运行了两次,因为浏览器发出了Preflight OPTION请求:

  

...“预检”请求首先由OPTIONS发送HTTP请求   方法,以确定另一个域上的资源   实际的请求是否可以安全发送。

为防止这种情况,我建议在CORS场景中使用这段代码,该场景在系统达到您的业务逻辑之前会返回OPTIONS请求:

app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", '*');
  ...
  if (req.method === 'OPTIONS') {
    res.sendStatus(200);
  }
  else {
    next();
  }
});