一旦完成,正确关闭mongoose的连接

时间:2012-01-11 03:37:26

标签: node.js mongodb mongoose

我在一个不打算连续运行的脚本中使用mongoose,我正面临着一个看似非常简单的问题但我找不到答案;简单地说,一旦我调用任何mongoose函数向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);

我尝试添加对mongoose.disconnect()的调用,但没有结果。除此之外,一切正常(寻找,保存......)。

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

由于

编辑:接受下面的答案,因为它在技术上是正确的,但如果有人再次遇到这个问题,似乎mongoose和/或mongodb驱动程序实际上没有关闭连接时,如果仍有查询请求它运行

它根本不记得断开连接调用,一旦查询完成运行它就不会这样做;它只是丢弃你的调用,没有抛出异常或任何类型的东西,并且从未真正关闭连接。

所以你有它:如果你想让它实际工作,请确保在调用disconnect()之前已经处理了每个查询。

7 个答案:

答案 0 :(得分:168)

您可以使用

关闭连接
mongoose.connection.close()

答案 1 :(得分:59)

另一个答案对我不起作用。我必须按照this answer中的说明使用mongoose.disconnect();

答案 2 :(得分:12)

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

for element in list_of_dictionaries:
for i in range(len(element['hobbies'])):
    print("{0} {1} {2}".format(element['name'],element['city'],element['hobbies'][i]))

答案 3 :(得分:3)

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

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

//do stuff

db.close()

答案 4 :(得分:2)

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

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

答案 5 :(得分: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');
});

答案 6 :(得分: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();
});