【发布时间】:2013-09-12 08:30:46
【问题描述】:
我目前正在测试一些代码如何应对以下场景:
- 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 方法中使用的用户名变量实际上是在我的完整代码中声明的,我在这篇文章中放置的代码是一个简化版本,用于说明结构和错误检查.
【问题讨论】:
-
这是一个很好的问题:当 db 连接丢失时,db.collection(上面的第 1 点)不会返回错误。 collection.find(上面的第 2 点)最终会返回一个错误,但它会在超过 1 分钟后返回。我在连接字符串中使用了 connectionTimeoutMS 和 socketTimeoutMS 设置,但行为没有改变。
-
嘿 @JesusRuiz,我认为 find 呼叫运行了大约 15-20 分钟,但它从未回拨。我之前曾尝试更改超时属性,但正如您所提到的,它们似乎没有任何效果!我不确定我是否在驱动程序中发现了一个错误,或者是否还有一些我仍然没有看到的东西:(
标签: javascript node.js mongodb error-handling timeout