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

mongoose连接关闭异常:如何使mongoose.connection.close()正常生效?

问题描述

以下是使用Mongoose操作MongoDB的代码:

const mongoose = require("mongoose");

mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});

const fruitSchema = new mongoose.Schema ({
  name: String,
  rating: Number,
  review: String
});

const Fruit = mongoose.model("Fruit", fruitSchema);

Fruit.find((err, fruits) => {
  if (err) {
    console.log(err);
  } else {
    fruits.forEach((fruit) => console.log(fruit.name));
  };

  mongoose.connection.close(function() { process.exit(0); });
});

在上述代码中,mongoose.connection.close(function() { process.exit(0); });可正常工作,但mongoose.connection.close()或mongoose.disconnect()无法生效。当前依赖版本:"dependencies": { "mongodb": "4.10", "mongoose": "^6.6.6" }

需求:让mongoose.connection.close()或mongoose.disconnect()正常工作,或推荐更简洁的连接关闭方式。


原因分析

mongoose.connection.close()和mongoose.disconnect()都是异步方法,它们返回Promise对象。直接调用时,程序不会等待异步关闭操作完成就继续执行后续逻辑(在你的场景中,程序可能在连接关闭操作完成前就已退出,导致看起来方法未生效)。而带回调的版本会在连接关闭完成后才执行process.exit(0),因此能正常触发关闭动作。


解决方法

方法1:用Promise链式调用处理异步关闭

利用方法返回的Promise,在关闭完成后执行退出逻辑:

Fruit.find((err, fruits) => {
  if (err) {
    console.log(err);
  } else {
    fruits.forEach((fruit) => console.log(fruit.name));
  };

  // 使用connection.close()
  mongoose.connection.close()
    .then(() => process.exit(0))
    .catch(err => {
      console.error('关闭连接失败:', err);
      process.exit(1);
    });

  // 或使用disconnect(),效果一致
  // mongoose.disconnect()
  //   .then(() => process.exit(0))
  //   .catch(err => {
  //     console.error('断开连接失败:', err);
  //     process.exit(1);
  //   });
});

方法2:用async/await简化异步流程

将回调函数改为async函数,通过await等待关闭操作完成:

Fruit.find(async (err, fruits) => {
  if (err) {
    console.log(err);
  } else {
    fruits.forEach((fruit) => console.log(fruit.name));
  };

  try {
    await mongoose.connection.close();
    // 或替换为 await mongoose.disconnect();
    process.exit(0);
  } catch (err) {
    console.error('关闭连接失败:', err);
    process.exit(1);
  }
});

方法3:推荐的简洁写法(扁平化异步逻辑)

改用async/await处理整个数据库操作流程,避免嵌套回调,逻辑更清晰:

async function run() {
  try {
    // 连接数据库
    await mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});
    
    // 查询数据
    const fruits = await Fruit.find();
    fruits.forEach(fruit => console.log(fruit.name));
    
    // 关闭连接
    await mongoose.disconnect();
    process.exit(0);
  } catch (err) {
    console.error('操作失败:', err);
    await mongoose.disconnect();
    process.exit(1);
  }
}

run();

内容的提问来源于stack exchange,提问作者Ankit Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:55:25