UPD:
この投稿に基づくと、ここで行っているのと同じことを行う修正プログラムが展開されているようです。これがすでにnpm(15.10.13)内にあるかどうかはわかりません。 https://github.com/mongodb/node -mongodb-native / issues / 1092#ref-commit-2667d13
調査の結果、そこで何が起こっているのかを理解することができました。
データベースを処理するメソッド(検索、更新、挿入など)を呼び出すたびに、独自のIDを持つカーソルが作成され、それ自体が登録されます。後でコールバックされるためにDbのEventEmitterに送信されます。その間、同じCallBackStore内の_notRepliedオブジェクトに自分自身を登録します。
しかし、接続が閉じられると、_notRepliedカーソルを反復処理し、エラーまたはタイマー付きのロジックでトリガーするものを見つけることができませんでした(まだどこかにある可能性があります)。だから私はなんとか小さな回避策を書くことができました、それはDBがclose
を出すときにエラーでカーソルを強制的にトリガーします イベント:
new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
if (!err) {
db.on('close', function() {
if (this._callBackStore) {
for(var key in this._callBackStore._notReplied) {
this._callHandler(key, null, 'Connection Closed!');
}
}
});
// ...
} else {
console.log(err)
}
});
MongoClientの代わりに最初のアプローチを使用することをお勧めします。理由はほとんどありません。たとえば、接続を閉じてから.find
を呼び出す場合です。 コールバックでエラーが適切にトリガーされますが、MongoClientではトリガーされません。
MongoClientを使用している場合:
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
if (!err) {
db.on('close', function() {
if (this._callBackStore) {
for(var key in this._callBackStore._notReplied) {
this._callHandler(key, null, 'Connection Closed!');
}
}
});
// ...
} else {
console.log(err);
}
});
これは何をしますか?接続が閉じられると、すべての_notRepliedカーソルを繰り返し処理し、エラーConnection Closed!
でイベントをトリガーします。 。
テストケース:
items.find({ }).toArray(function(err, data) {
if (!err) {
console.log('Items found successfully');
} else {
console.log(err);
}
});
db.close();
これにより、データベース接続が強制的に閉じられ、close
がトリガーされます 以前に処理し、カーソルが確実に閉じられるようにするイベント。
UPD:GitHubにIssueを追加しました: https://github.com / mongodb / node-mongodb-native / issues / 1092 これに関して彼らが何を言っているか見ていきます。