MongoDB插入文档时报错Topology is closed的原因及解决方法咨询
报错
Topology is closed的原因 - 核心问题是异步执行逻辑顺序错误:你的
mongo()是异步函数,内部的insertMany写入操作是异步任务,调用mongo()时没有添加await,程序不会等待写入操作完成,就直接执行了后面的client.close()关闭了MongoDB连接。等写入操作真正需要访问数据库时,连接已经被销毁,就会触发该报错。 - 额外问题:代码用了回调嵌套+
async/await混用的写法,逻辑层级混乱,更容易出现异步时序问题。
修复方案
推荐全量改用async/await的写法,保证所有数据库操作执行完成后再关闭连接,修改后的完整代码如下:
const { MongoClient } = require('mongodb'); const uri = "mongodb+srv://(login info)@cluster0.56skb.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); async function runMongoOperations() { try { // 等待数据库连接建立完成 await client.connect(); const db = client.db("test"); // 等待批量插入操作执行完成 const insertRes = await db.collection('a').insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A"}, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A"}, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D"}, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D"}, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A"} ]); // 可在此处处理插入结果,比如打印插入记录数 console.log('成功插入文档数:', insertRes.insertedCount); // 其他数据库操作放在此处,全部执行完成后再关闭连接 const collection = client.db("test").collection("devices"); // 对devices集合的操作逻辑写在这里 } catch (error) { // 捕获所有流程中的错误,方便排查 console.error('操作出错:', error); } finally { // 无论操作成功/失败,最后统一关闭连接 await client.close(); } } // 执行数据库操作函数 runMongoOperations();
修改说明:
- 移除回调写法,统一用
async/await管理异步逻辑,避免时序混乱 - 所有异步数据库操作前都添加
await,保证操作完成后再执行后续逻辑 - 增加
try/catch/finally结构,统一处理错误、关闭连接,避免连接泄漏
内容的提问来源于stack exchange,提问作者Krix
相关产品推荐
相关产品推荐

