Mongoose Model.find()在未连接到数据库时挂起

时间:2012-07-23 07:52:53

标签: node.js mongodb mongoose

我正在经历一些错误情景,试图了解如何处理这些情况。

在没有数据库连接的情况下,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...
    });
 }

3 个答案:

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

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

  2. 在options.db部分配置autoReconnect:false 在数据库级别禁用autoReconnet。 (查看更多信息here

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

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