我在一个不打算连续运行的脚本中使用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()之前已经处理了每个查询。
答案 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();
});