为何不带await的User.findByIdAndUpdate完全不生效?
为何不带await的User.findByIdAndUpdate完全不生效?
嗨,我来帮你把这个问题掰明白~
你可能误以为“不需要返回值就不用加await”,但其实Mongoose的findByIdAndUpdate(以及大部分Mongoose查询方法)的逻辑有点特殊:如果你不加上await或者调用.exec(),它只是构建了一个查询对象,根本不会真正发送请求到MongoDB服务器执行操作。
你看你的代码里,没加await的那行User.findByIdAndUpdate(...),其实只是创建了一个待执行的查询,并没有触发实际的数据库更新。而你的代码紧接着就返回了200的响应,Node.js在处理完HTTP请求后,会结束当前的事件循环上下文,这个没被执行的查询就直接被丢弃了——所以数据库里的数据完全没变化,这就解释了你用findById()验证时看不到更新的原因。
至于为什么没报错还返回了200?因为没加await的情况下,这个未执行的查询不会抛出任何错误(除非你手动处理它的Promise回调),代码一路顺畅走到了成功响应的分支,自然就返回200了,但实际上更新操作根本没跑起来。
解决办法很简单:哪怕你不需要这个更新操作的返回值,也必须加上await,这样才能触发查询执行,并且等待数据库操作完成:
await User.findByIdAndUpdate(user.userid, { $push: {reviews: review._id} });
这样你的代码才会真正把更新指令发送给MongoDB,用户的reviews数组才会被正确更新。
备注:内容来源于stack exchange,提问作者Jeongwoo Kim
相关产品推荐
相关产品推荐

