Node.js Mongoose Model.find()在未连接到数据库时挂起
我正在经历一些错误场景,试图了解如何处理这些错误 在没有数据库连接的情况下,MongooseNode.js Mongoose Model.find()在未连接到数据库时挂起,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在经历一些错误场景,试图了解如何处理这些错误 在没有数据库连接的情况下,MongooseModel.find(…)调用似乎挂起。下面是示例代码。我假设回调是通过err对象调用的,但事实并非如此 如何防止模型调用挂起?每次访问模型时是否必须手动检查readyState // app.js // Let's use a non-existing host so connecting fails: // (callback is invoked with err object) 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...
});
}
由于您已经在connect调用中使用了错误处理程序,因此明智的做法是在DB未启动时退出应用程序,或者激活一些中间件,这些中间件会以一个漂亮的
500内部服务器错误
响应
Mongoose在引擎盖下使用节点mongodb native
连接mongodb,您可能会在其中找到其他有用的连接选项。:)
编辑:尝试设置socketOptions.socketTimeoutMS
。显然没有默认的超时设置。看
我的工作机器上没有节点来为您测试确切的语法,但您可能必须使用
mongoose.Connection
,它有一个open()
方法,该方法接受传递到node mongodb native
的选项。我不认为mongoose.connect()
接受这些选项,但我可能错了。这不是答案,但希望它能帮助您找到解决方案。我和他有非常相似的问题
mongoose.createConnection
在使用passport模块时,发现它与
mongoose.connect要解决此问题,您需要执行3项任务:
显示实现
find
方法的代码,您正在调用BlogPost
@ebohlmanBlogPost
是一个mongoose模型(我更新了代码)。如果服务器启动后数据库关闭,情况如何?初始连接将成功,但以后对find()
的调用不会如我前面所述阻塞吗?我已经做了更多的研究,请参见编辑。但是,在我稍后可以测试你的问题之前,请不要把这个放在心上据我所知,mongo/mongoose正在缓冲find
,直到db重新连接。我相信默认选项它会尝试自动重新连接。在特定的OP示例中,您需要检查您是否有有效的初始连接。如果可以的话,我会给它一个+100。我已经试着解决这个问题好几个小时了。非常感谢。多年来我都不可能弄清楚。这就解释了区别。我刚刚提交了一个问题