Mongoose findByIdAndUpdate返回旧值:await与.then使用疑问
问题解答
关于.then代码的执行时机
.then里的代码确实会等待数据库操作完成后才执行,你用await配合.then的写法,本质上还是会等待findByIdAndUpdate的Promise完成后才进入回调逻辑,所以异步执行顺序不是问题所在。
核心原因:Mongoose的默认行为
你遇到的情况是Mongoose的预期行为——findByIdAndUpdate默认返回的是更新前的旧文档,不管你用await还是.then,拿到的都是更新前的数据,所以存入session的自然是旧值。
解决方案:添加new: true选项
要获取更新后的文档,需要给findByIdAndUpdate传入第三个参数,设置{ new: true },它会告诉Mongoose返回更新后的最新文档。
修正后的await版本代码
const user = await db.findByIdAndUpdate(_id, {key1: value1, key2: value2}, { new: true }); if (user) { console.log(`User:${user}`); req.session.tempUser = user; res.redirect(`/routeA`); } else { console.log(`No Users was found`); console.log(`Error:${error}`); res.redirect(`/routeB`); }
修正后的.then版本代码
db.findByIdAndUpdate(_id, {key1: value1, key2: value2}, { new: true }) .then ((user) => { console.log(`User:${user}`); req.session.tempUser = user; return res.redirect(`/routeA`); }) .catch ((error) => { console.log(`No User was found`); console.log(`Error:${error}`); return res.redirect(`/routeB`); });
(注:此处无需额外加await,.then本身属于Promise链式调用,加await不会改变逻辑,但也不影响运行)
额外补充:如果需要触发文档的pre/post中间件验证逻辑,可以在选项里再加{ runValidators: true },确保更新时的字段验证生效。
内容的提问来源于stack exchange,提问作者TimH
相关产品推荐
相关产品推荐

