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

Lep*_*eus 128 mongoose mongodb node.js

我在一个不打算连续运行的脚本中使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

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

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

所以你有它:确保在调用disconnect()之前已经处理了每个查询,如果你想让它真正起作用的话.

小智 182

您可以关闭连接

mongoose.connection.close()
Run Code Online (Sandbox Code Playgroud)

  • 这实际上关闭了连接.但是,此调用正在清除数据库中的内容.当我切换到mongoose.disconnect()时,一切正常,我的摩卡测试再次开始正常工作 (20认同)
  • 如您所见,这些答案都是陈旧的.如果你正在使用_Mongoose 5.0.4_,那么[`Connection.close()`方法](http://mongoosejs.com/docs/api.html#connection_Connection-close)只会被导出,只有可用,所以请使用它. (3认同)
  • 这对我有用。我只需要确保我把它放在正确的回调中,否则它可能在保存到数据库之前关闭连接有机会完成。公平地说,我仍然使用一个简单的脚本,它只连接到本地数据库并保存一个简单的示例用户对象。在 user.save() 的回调中,我调用了 mongoose.connection.close()。 (2认同)

msr*_*thr 66

另一个答案对我不起作用.我不得不mongoose.disconnect();按照这个答案的说法使用.


Jak*_*son 14

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

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

// Do some stuff

db.disconnect();
Run Code Online (Sandbox Code Playgroud)


Zoh*_*mir 7

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

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


adi*_*gil 6

正如杰克威尔逊所说:您可以将连接设置为变量,然后在完成后断开连接:

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


function afterwards(){

    //do stuff

    db.disconnect();
}
Run Code Online (Sandbox Code Playgroud)

或者如果在 Async 函数中:

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

    //do stuff

    db.disconnect()
})
Run Code Online (Sandbox Code Playgroud)

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