使用mongoose.disconnect()出现MongoNetworkError,求正确关闭连接方法
解决Mongoose调用disconnect()抛出MongoNetworkError的问题
错误原因
这个错误的核心诱因:
- Mongoose的连接是异步操作,你的代码在连接尚未完全建立时就执行了
person.save()这类数据库操作,后续调用disconnect()时连接仍处于建立流程中,直接导致连接被取消。 person.save()属于异步操作,你没有等待它执行完成就触发查询和断开连接,数据库操作还在进行时就关闭连接,进而引发错误。
正确实现方式
要确保所有数据库操作都在连接成功后执行,且等所有异步操作完成后再调用disconnect(),可以通过以下两种方式修正:
方式1:用async/await统一管理异步流程
const mongoose = require("mongoose"); const mongoDB = "mongodb://127.0.0.1:27017/fruitsDB"; // 用async函数包裹所有逻辑,确保连接建立后再执行后续操作 async function run() { try { // 先等待连接成功 await mongoose.connect(mongoDB, { useNewUrlParser: true, useUnifiedTopology: true }); console.log("MongoDB connected"); // 定义Schema与Model const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Fruit = mongoose.model("Fruit", fruitSchema); const personSchema = new mongoose.Schema({ name: String, age: Number }); const Person = mongoose.model("Person", personSchema); // 等待person保存操作完成 const person = new Person({ name: "xyz", age: 37 }); await person.save(); // 执行查询并处理结果 const fruits = await Fruit.find({}); fruits.forEach(fruit => console.log(fruit.name)); // 所有操作完成后断开连接 await mongoose.disconnect(); console.log("MongoDB disconnected"); } catch (err) { console.error("Error:", err); // 出错时也要确保断开连接,避免连接泄漏 await mongoose.disconnect(); } } run();
方式2:用Promise链式调用串联流程
const mongoose = require("mongoose"); const mongoDB = "mongodb://127.0.0.1:27017/fruitsDB"; mongoose.connect(mongoDB, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log("MongoDB connected"); const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Fruit = mongoose.model("Fruit", fruitSchema); const personSchema = new mongoose.Schema({ name: String, age: Number }); const Person = mongoose.model("Person", personSchema); const person = new Person({ name: "xyz", age: 37 }); // 先完成person保存操作 return person.save(); }) .then(() => { // 保存完成后执行查询 return Fruit.find({}); }) .then(fruits => { fruits.forEach(fruit => console.log(fruit.name)); // 查询完成后断开连接 return mongoose.disconnect(); }) .then(() => { console.log("MongoDB disconnected"); }) .catch(err => { console.error("Error:", err); mongoose.disconnect(); });
关键注意事项
- 绝对不能在数据库操作未完成时调用
disconnect(),必须等待所有异步操作(save()、find()、insertMany()等)的Promise状态变更后再执行断开。 - 所有数据库相关逻辑要放在连接成功的回调或
await connect()之后,确保连接完全建立后再操作数据库。 - 异常处理分支里也要调用
disconnect(),避免出现连接泄漏问题。
内容的提问来源于stack exchange,提问作者Harsh Singh
相关产品推荐
相关产品推荐

