継続的に実行することを意図していないスクリプトでmongooseを使用していますが、非常に単純な問題と思われるものに直面していますが、答えが見つかりません。リクエストを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ドライバーは、まだ実行中のクエリがあるかどうかを尋ねたときに実際に接続を閉じないようです.
切断コールもまったく覚えておらず、クエリの実行が終了するとそれを行いません。例外がスローされたり、なんらかの例外が発生したりせずに呼び出しが破棄されるだけで、実際に接続が閉じられることはありません。
ですから、実際に動作させたい場合は、disconnect()を呼び出す前にすべてのクエリが処理されていることを確認してください。
で接続を閉じることができます
mongoose.connection.close()
他の答えは私にはうまくいきませんでした。 この回答 に記載されているように、mongoose.disconnect();
を使用する必要がありました。
変数への接続を設定し、完了したら接続を切断できます。
var db = mongoose.connect('mongodb://localhost:27017/somedb');
// Do some stuff
db.disconnect();
私はバージョン4.4.2を使用していますが、他の答えはどれもうまくいきませんでした。しかし、useMongoClient
をオプションに追加し、close
onと呼ぶ変数にそれを入れることはうまくいくように見えました。
var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })
//do stuff
db.close()
メソッドの外部で閉じる/切断しようとすると、エラーが発生します。最善の解決策は、メソッドの両方のコールバックで接続を閉じることです。ダミーコードはこちらです。
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');
});
おそらくあなたはこれを持っています:
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();
});