我目前正在测试一些代码对以下场景的适应性:
- 启动Node.js应用程序并成功建立与mongodb的连接
- 成功设置连接后,mongodb服务器崩溃,所有随后的请求都失败了
为此,我使用了官方驱动程序的以下代码(在此处找到:https://github.com/mongodb/node-mongodb-native):
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
app.get('/test', function(req, res) {
db.collection('users', function (err, collection) {
console.log(err);
if (err) {
// ## POINT 1 ##
// Handle the error
}
else {
collection.find({ 'username': username }, { timeout: true }).toArray(function(err, items) {
console.log(err);
if (err) {
// ## POINT 2 ##
// Handle the error
}
else {
if (items.length > 0) {
// Do some stuff with the document that was found
}
else {
// Handle not finding the document
}
}
});
}
});
});
由于在处理请求时,mongodb服务器已经停止运行,因此我认为在标记为## POINT 1 ##或## POINT 2 ##的任一点,它都会返回一个超时错误;然而实际情况并非如此。
我尝试了许多不同的设置(包括您在此处看到的明确允许游标超时的设置),但似乎无论如何都无法启用它。在我尝试的每个配置中,Node.js都将继续等待find()操作进行回调,但它从未回调过。
如果我在运行mongodb之前启动Node.js应用程序,则可以在连接回调中捕获错误,但是如果连接在那之后断开,则似乎以任何方式都不能处理它。
是否有我遗漏的设置或者没有办法检测到已经建立的连接被终止?
编辑:仅为明确起见,find方法中使用的username变量实际上是在我的完整代码中声明的,我在此贴出的代码是一个简化版本,用于说明结构和错误检查。