Mongoose findOneAndUpdate返回旧值,如何结合.then()获取更新后的值?
解决Mongoose findOneAndUpdate返回旧值的问题
嘿,这个问题我熟,马上帮你搞定!
你碰到的问题本质是:Mongoose的findOneAndUpdate方法默认返回更新前的旧文档,所以你才会看到控制台打印旧值。你提到的{new: true}确实是解决方案,但需要注意它的传入位置——而且你的代码里还存在一个参数顺序的错误,我一起帮你修正。
来看调整后的完整代码片段:
router.post('/profile/:userId', checkAuth, (req, res, next) => { Profile.findOneAndUpdate( // 第一个参数:查询条件(用来定位要更新的文档,这里用路由里的userId更合理) { user: req.params.userId }, // 第二个参数:要更新的字段和对应值 { name: req.body.name, age: req.body.age, education: req.body.education, location: req.body.location, phone: req.body.phone }, // 第三个参数:配置选项,添加new: true就能拿到更新后的文档 { new: true } ).then(result => { console.log(result); // 现在这里输出的就是更新后的最新数据了 res.status(200).json({ message: "Profile updated successfully", updatedProfile: result }); }).catch(err => { res.status(500).json({ error: err }); }); });
几个关键提醒:
- 你原来的代码把要更新的字段放到了第一个参数的位置,这是错误的!
findOneAndUpdate的参数顺序是:查询条件→更新数据→配置选项,一定要按这个顺序传参。 - 因为你的路由是
/profile/:userId,用req.params.userId作为查询条件来定位用户的Profile,比用req.body.user更符合RESTful的设计逻辑。 - 如果你的Mongoose版本是4.x及以上,
{new: true}完全有效;要是用了非常老的版本,可能需要换成{ returnOriginal: false },不过现在大部分项目都是新版本,前者就够用。
内容的提问来源于stack exchange,提问作者Soham Das
相关产品推荐
相关产品推荐

