一旦你完成了,正确地关闭猫鼬的连接

我在一个不需要连续运行的脚本中使用猫鼬,我面临着一个看起来很简单的问题,但是我找不到一个答案; 只要调用任何猫鼬函数,发送请求到 mongodb,我的 nodejs 实例就永远不会停止,我必须手动关闭它,比如,Ctrl + c 或 Program.exit ()。

代码大致如下:

var mongoose = require('mongoose');


// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ?
mongoose.connect('mongodb://localhost:27017/somedb');


// define some models


// if I include this line for example, node never stop afterwards
var MyModel =  mongoose.model('MyModel', MySchema);

我尝试添加调用 mongose.disconnect () ,但是没有得到结果。除此之外,一切都很好(查找、保存、 ...)。

这是完全相同的问题,因为这个人,遗憾的是,他没有收到任何答案: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

谢谢

编辑: 接受下面的答案,因为它在技术上是正确的,但如果有人再次遇到这个问题,似乎猫鼬和/或 mongodb 驱动程序并没有真正关闭连接,当你问它,如果仍然有查询运行。

它甚至根本不记得断开连接的调用,一旦查询运行完毕,它也不会这样做; 它只是丢弃您的调用,没有抛出任何异常或类似的东西,并且永远不会真正关闭连接。

因此,如果您希望 disconnect ()能够实际工作,那么在调用 disconnect ()之前,请确保每个查询都已经处理完毕。

172400 次浏览

可以用。关闭连接

mongoose.connection.close()

另一个答案对我不起作用。我必须使用 mongoose.disconnect();,就像在 这个答案中说的那样。

您可以设置连接到一个变量,然后断开它当您完成:

var db = mongoose.connect('mongodb://localhost:27017/somedb');


// Do some stuff


db.disconnect();

我使用的是4.4.2版本,其他的答案都不适合我。但是将 useMongoClient添加到选项中,并将其放入一个调用 close的变量中,似乎是可行的。

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })


//do stuff


db.close()

如果尝试在方法之外关闭/断开连接,将得到一个错误。最佳解决方案是关闭方法中两个回调中的连接。假代码在这里。

const newTodo = new Todo({text:'cook dinner'});


newTodo.save().then((docs) => {
console.log('todo saved',docs);
mongoose.connection.close();
},(e) => {
console.log('unable to save');
});

也许你有这个:

const db = mongoose.connect('mongodb://localhost:27017/db');


// Do some stuff


db.disconnect();

但你也可以有这样的东西:

mongoose.connect('mongodb://localhost:27017/db');


const model = mongoose.model('Model', ModelSchema);


model.find().then(doc => {
console.log(doc);
}

您不能调用 db.disconnect(),但可以在使用后关闭连接。

model.find().then(doc => {
console.log(doc);
}).then(() => {
mongoose.connection.close();
});

正如 Jake Wilson 所说: 你可以将连接设置为一个变量,然后在完成后断开它:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
db = dbConnection;
afterwards();
});




function afterwards(){


//do stuff


db.disconnect();
}

或者如果在 Async 功能内:

(async ()=>{
const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient:
true })


//do stuff


db.disconnect()
})

否则,当我在我的环境中检查它时,它有一个错误。

mongoose.connection.close(function(){
console.log('Mongoose default connection disconnected through app termination;);
process.exit(0);
});

这将关闭猫鼬连接,并通过控制台中的消息通知您。