You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:05:20