我正在经历一些错误情景,试图了解如何处理这些情况。
在没有数据库连接的情况下,Mongoose Model.find(...)
调用似乎挂起。下面是示例代码。我会假设使用err
对象调用回调,但事实并非如此。
如何阻止模型调用挂起?每次访问模型时,我是否需要手动检查readyState
?
// app.js
// Let's use a non-existing host so connecting fails:
// (callback is invoked with err object)
mongoose.connect('mongodb://localhostXXX/blog', function(err){ ... });
BlogPost = mongoose.model('BlogPost', BlogPostSchema);
// api.js
exports.list_posts = function(req, res) {
// Ready state is '0' = disconnected (since we used a wrong hostname)
console.log('DB ready state: ' + BlogPost.db.readyState);
// This will not invoke the callback:
BlogPost.find(function(err, threads) {
// Never called...
});
}
答案 0 :(得分:7)
这不是答案,但希望它能帮助您找到解决方案。有非常相似的问题 mongoose.createConnection 使用护照模块时,发现它可以正常使用 mongoose.connect
答案 1 :(得分:4)
由于您已经在connect调用中使用了错误处理程序,因此当数据库未启动时,退出应用程序或激活一些以漂亮500 Internal Server Error
响应的中间件时,一个明智的做法是。
Mongoose使用node-mongodb-native
来连接到mongodb,您可能会在其中找到其他有用的连接选项。 :)
编辑:尝试设置socketOptions.socketTimeoutMS
。显然没有默认的超时设置。请参阅http://mongodb.github.com/node-mongodb-native/api-generated/server.html。
我的工作机器上没有节点可以为您试用确切的语法,但您可能必须使用mongoose.Connection
,其open()
方法接受通过的选项到node-mongodb-native
。我认为mongoose.connect()
不接受这些选项,但我可能错了。
答案 2 :(得分:0)
为了解决这个问题,你需要做3个任务: