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
相关产品推荐
相关产品推荐

