这是我的代码:
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 }
是什么原因导致我使用异步/等待时此代码返回两次?
答案 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();
}
});