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个任务:

  1. 在options.db部分中configurationbufferMaxEntries:0(有关更多详细信息,请参阅此处 )。因此,禁用bufferMaxEntries时,会导致mongoose停止缓冲区命令,并在服务器closures时重试发送它们。

  2. 在options.db部分configurationautoReconnect:false在db级别禁用autoReconnet。 ( 在这里看到更多的信息)

  3. 如果您正在使用mongodb replicaset,则需要禁用架构级别的bufferCommands(对于您创build的每个架构)

    var schema = new Schema({..},{bufferCommands:false});