You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:50:27