CẬP NHẬT:
Dựa trên bài đăng này, có vẻ như họ đã triển khai bản sửa lỗi sẽ hoạt động giống như những gì chúng tôi làm ở đây. Không chắc liệu điều này đã có trong npm (15.10.13) hay chưa. https://github.com/mongodb/node -mongodb-native / issue / 1092 # ref-commit-2667d13
Sau một số cuộc điều tra, tôi đã cố gắng hiểu được điều gì đang xảy ra ở đó:
Mỗi khi bạn gọi bất kỳ phương thức nào để xử lý cơ sở dữ liệu (tìm, cập nhật, chèn, v.v.), nó sẽ tạo ra con trỏ, có ID riêng và tự đăng ký tới EventEmitter of Db để được gọi lại sau. Trong khi chờ đợi, nó tự đăng ký vào đối tượng _notReplied trong cùng một CallBackStore.
Nhưng khi kết nối bị đóng, tôi không thể tìm thấy bất kỳ thứ gì sẽ lặp lại qua các con trỏ _notReplied và sẽ kích hoạt chúng với lỗi hoặc bất kỳ logic nào với bộ hẹn giờ (nó vẫn có thể ở đâu đó). Vì vậy, tôi đã quản lý để viết các công việc nhỏ xung quanh, điều đó buộc kích hoạt con trỏ với lỗi khi DB phát ra close
sự kiện:
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)
}
});
Tôi khuyên bạn nên sử dụng phương pháp tiếp cận đầu tiên thay vì MongoClient. Rất ít lý do:ví dụ:khi bạn đóng kết nối rồi gọi .find
nó sẽ kích hoạt lỗi đúng cách khi gọi lại, trong khi với MongoClient thì không.
Nếu bạn đang sử dụng 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);
}
});
Điều này sẽ làm gì? Sau khi kết nối bị đóng, nó sẽ lặp lại qua Tất cả con trỏ _notReplied và kích hoạt các sự kiện cho chúng với lỗi Connection Closed!
.
Trường hợp thử nghiệm:
items.find({ }).toArray(function(err, data) {
if (!err) {
console.log('Items found successfully');
} else {
console.log(err);
}
});
db.close();
Điều đó sẽ buộc đóng kết nối cơ sở dữ liệu và kích hoạt close
sự kiện mà bạn xử lý trước đó và sẽ đảm bảo rằng con trỏ sẽ được đóng lại.
CẬP NHẬT:Tôi đã thêm Vấn đề trên GitHub: https://github.com / mongodb / node-mongodb-native / issue / 1092 chúng ta sẽ xem họ nói gì về điều này.