为何MongoDB insertMany回调无输出?数据已入库求代码排查
问题排查与解决
你的问题核心在于异步操作的执行时机以及MongoDB驱动的现代使用逻辑:
为什么回调没触发?
你使用的是新版MongoDB Node.js驱动(v4及以上),虽然驱动仍兼容回调写法,但你的run是async函数——执行到insertMany后,函数直接走完逻辑并结束,Node.js进程会在回调函数被调用前就退出(事件循环里没有需要等待的异步任务),导致回调里的console.log完全没机会执行。两种可行解决办法:
方法一:改用async/await(推荐,符合现代JS规范)
放弃回调,直接通过await等待insertMany完成,确保程序执行到输出逻辑:
const { MongoClient } = require("mongodb"); const uri = "*****"; const client = new MongoClient(uri); async function run() { try { const database = client.db("task-manager"); const tasksCollection = database.collection("tasks"); const query = { title: "Back to the Future" }; const movie = await tasksCollection.findOne(query); // 用await获取插入结果 const result = await tasksCollection.insertMany([ { title: "Tom & Jerry 2011" }, { title: "Tom & Jerry 2012" }, { title: "Tom & Jerry 2013" }, ]); console.log(result.insertedIds); // 现在能正常输出 } catch (err) { console.log("插入失败", err); } finally { // 操作完成后关闭客户端连接 await client.close(); } } run().catch(console.dir);
方法二:强制进程等待回调执行(兼容旧写法)
如果必须保留回调,需要在回调内关闭客户端连接,让进程等待到回调执行完毕,同时补上错误处理:
const { MongoClient } = require("mongodb"); const uri = "*****"; const client = new MongoClient(uri); async function run() { try { const database = client.db("task-manager"); const tasksCollection = database.collection("tasks"); const query = { title: "Back to the Future" }; const movie = await tasksCollection.findOne(query); tasksCollection.insertMany( [ { title: "Tom & Jerry 2011" }, { title: "Tom & Jerry 2012" }, { title: "Tom & Jerry 2013" }, ], async (err, result) => { if (err) { console.log("插入失败", err); } else { console.log(result.insertedIds); } // 回调执行完再关闭连接,确保进程不提前退出 await client.close(); } ); } catch (err) { console.dir(err); await client.close(); } } run().catch(console.dir);
另外注意:你的原代码try块没有对应catch,findOne的错误无法被捕获,上面两种写法都补上了完整的错误处理和连接关闭逻辑,这也是生产环境代码的必要规范。
内容的提问来源于stack exchange,提问作者Khant Min Si Thu
相关产品推荐
相关产品推荐

