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)
Jak*_*son 14
您可以设置与变量的连接,然后在完成后断开连接:
var db = mongoose.connect('mongodb://localhost:27017/somedb');
// Do some stuff
db.disconnect();
Run Code Online (Sandbox Code Playgroud)
mongoose.connection.close(function(){
console.log('Mongoose default connection disconnected through app termination');
process.exit(0);
});
Run Code Online (Sandbox Code Playgroud)
这将关闭猫鼬连接,并且还会通过控制台中的消息通知您。
正如杰克威尔逊所说:您可以将连接设置为变量,然后在完成后断开连接:
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)
否则,当我在我的环境中检查它时,它会出错。