MongoDB保存对象后立即查询返回null的原因排查
问题分析与修复方案
核心问题出在saveObject函数的异步处理逻辑——你用了await,但实际上并没有真正等待MongoDB的保存操作完成。
错误原因
Mongoose的save()方法有两种使用方式:
- 传回调函数:此时它不会返回Promise,所以你写的
await newObject.save(function(err, doc) {...})完全无效,saveObject会直接执行完毕,而数据库的写入操作还在后台异步进行。这时候紧接着调用getObject,自然查不到还没写完的数据。 - 不传回调:此时它会返回一个Promise,才能被
await正确等待。
修复代码
把saveObject改成Promise风格的写法,去掉回调:
async function saveObject(...) { try { await newObject.save(); } catch (err) { console.error(err); throw err; // 建议抛出错误,让接口层可以处理并返回错误响应 } }
补充说明
- 单独调用
save和get正常,是因为单独测试时两次操作之间有足够的时间差,数据库已经完成了写入;但接口里是连续的await调用,因为之前的await没生效,查询操作跑在了写入操作前面。 - JavaScript异步执行没有什么“离开作用域才同步”的特殊规则,本质就是你没正确等待异步操作完成。只要保证
await的是一个真正的Promise,就能确保后续代码在异步操作完成后再执行。
内容的提问来源于stack exchange,提问作者psclp
相关产品推荐
相关产品推荐

