完成后,正确关闭猫鼬的连接


145

我在不希望连续运行的脚本中使用猫鼬,而且我面对的似乎是一个非常简单的问题,但我找不到答案。简单地说,只要我调用将请求发送到mongodb的任何mongoose函数,我的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);

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

这和这个人是完全一样的问题,可惜他没有得到任何答案:https : //groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

谢谢

编辑:接受下面的答案,因为它在技术上是正确的,但是如果有人再次遇到此问题,则当您询问是否还有查询正在运行时,mongoose和/或mongodb驱动程序似乎实际上并未关闭连接。

它甚至根本不记得断开连接的调用,一旦查询运行完成,它就不再执行。它只会丢弃您的呼叫,不会引发任何异常或任何类似情况,并且永远不会真正关闭连接。

这样就可以了:如果您希望每个查询真正起作用,请确保在调用断开连接()之前已处理了每个查询。


1
是否可以仅通过导入模型来做到这一点?以下答案均无效:\
安东尼

Answers:


201

您可以通过以下方式关闭连接

mongoose.connection.close()

25
实际上,这确实关闭了连接。但是,此调用正在清除数据库中的内容。当我切换到mongoose.disconnect()时,一切正常,我的摩卡测试再次开始正常工作
Brian Noah 2014年

1
这对我有用。我只需要确保将其放置在正确的回调中,否则在保存到数据库之前,它可能正在关闭连接,从而有机会完成操作。公平地说,我仍在使用一个简单的脚本,该脚本仅连接到本地数据库并保存一个简单的示例用户对象。在user.save()的回调中,我将其称为mongoose.connection.close()。
FateNuller

6
如您所见,这些答案很旧。如果您使用的是Mongoose 5.0.4,则Connection.close()方法仅导出,仅可用,因此请使用它。
КонстантинВан


17

您可以将连接设置为变量,然后在完成后断开连接:

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

// Do some stuff

db.disconnect();

在我的情况下(在Jest中测试猫鼬),这是唯一可行的解​​决方案
Code Whisperer

我在for循环中用Mongoose进行Model.update(..)。每次更新后是否需要关闭连接?我的服务器必须处理大量更新,并在一段时间后停止工作。
皮尔

以下是相同的答案
Daniel W.

3

我使用的是4.4.2版,其他答案对我都不起作用。但是添加useMongoClient到选项并将其放入您调用的变量中close似乎可行。

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

//do stuff

db.close()

1

如果您尝试在方法之外关闭/断开连接,则会收到错误消息。最好的解决方案是在方法中的两个回调中都关闭连接。伪代码在这里。

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');
});

1

就像杰克·威尔逊(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()
})

否则,当我在我的环境中检查它时,会出现错误。


0

可能您有:

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();
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.