JS中如何用async/await等待Mongoose insertMany完成后执行find
Mongoose 按序执行插入、查询的async/await实现
Mongoose 所有原生方法在不传入回调函数时,都会返回Promise对象,因此可以直接用async/await做异步流程控制,严格保证insertMany执行完成后再触发find操作。
实现注意事项
- 所有await语句需要放在
async标记的函数内,Node.js 14.8+版本的ES Module环境支持直接使用顶层await,无需额外包裹函数 - 用
try/catch块统一捕获数据库操作抛出的异常,替代原有回调中的错误判断逻辑 - 原有回调写法的问题在于两个异步操作会并行发起,
find不会等待插入完成,很容易出现查不到刚写入数据的情况
代码实现
通用兼容写法(适配所有Node.js版本)
async function handleFruitData() { try { // 等待批量插入操作完成 await Fruit.insertMany([kivi, orange, mango]); console.log("operation successful: saved all fruits to DB"); // 插入完成后才会执行查询逻辑 const fruitList = await Fruit.find({ name: 'kivi' }); console.log(fruitList); } catch (err) { // 捕获插入、查询全流程的错误 console.log(err); } } // 执行操作 handleFruitData();
顶层await写法(仅支持高版本Node.js ES Module环境)
try { await Fruit.insertMany([kivi, orange, mango]); console.log("operation successful: saved all fruits to DB"); const kiviList = await Fruit.find({ name: 'kivi' }); console.log(kiviList); } catch (err) { console.log(err); }
注:原回调代码存在两处笔误:一是
insertMany回调形参写为e,错误打印时用了未定义的err变量;二是提示文案中succesful拼写错误,上述示例已做修正。
内容的提问来源于stack exchange,提问作者Nishant Vikram Singh
相关产品推荐
相关产品推荐

