Mongoose Model.find()在未连接数据库时挂起
我正在经历一些错误情况,试图理解如何处理这些情况。
在没有数据库连接的情况下,Mongoose Model.find(...)
调用似乎挂起。 下面的示例代码。 我会假定这个callback函数是用一个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... }); }
这不是一个答案,但希望它会帮助你find解决办法。 在使用护照模块的时候和mongoose.createConnection有非常相似的问题,发现它和mongoose.connect
由于您已经在连接调用中使用了error handling程序,因此在数据库未启动时退出应用程序或激活一些响应相当的500 Internal Server Error
中间件是明智的。
Mongoose使用node-mongodb-native
来连接到mongodb,您可能会在其中find其他有用的连接选项。 🙂
编辑:尝试设置socketOptions.socketTimeoutMS
。 显然没有默认超时设置。 请参阅http://mongodb.github.com/node-mongodb-native/api-generated/server.html 。
我的工作机器上没有节点来为您testing确切的语法,但您可能必须使用mongoose.Connection
,它具有一个open()
方法,该方法接受传递给node-mongodb-native
。 我不认为mongoose.connect()
接受这些选项,但我可能是错的。
为了解决这个问题,你需要做3个任务:
-
在options.db部分中configurationbufferMaxEntries:0(有关更多详细信息,请参阅此处 )。因此,禁用bufferMaxEntries时,会导致mongoose停止缓冲区命令,并在服务器closures时重试发送它们。
-
在options.db部分configurationautoReconnect:false在db级别禁用autoReconnet。 ( 在这里看到更多的信息)
-
如果您正在使用mongodb replicaset,则需要禁用架构级别的bufferCommands(对于您创build的每个架构)
var schema = new Schema({..},{bufferCommands:false});