2012-07-23 78 views
8

我正在经历一些错误情况,试图了解如何处理这些情况。Mongoose Model.find()在未连接到数据库时挂起

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

显示实现您在'BlogPost'上调用的'find'方法的代码。 – ebohlman 2012-07-23 08:23:28

+0

@ebohlman'BlogPost'是一个猫鼬模型(我更新了代码)。 – Mark 2012-07-23 08:30:23

回答

4

既然你已经在连接调用使用错误处理,一个明智的做法是退出你的应用程序时,DB不起来,或激活某些中间件都与一个漂亮的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()接受这些选项,但我可能是错的。

+0

服务器启动后数据库关闭的情况如何?初始连接会成功,但不会像上面描述的那样调用'find()'块。 – Mark 2012-07-23 13:45:08

+0

我已经做了更多的研究,请参阅编辑。但是要用一粒盐来做这件事,直到我可以在以后测试你的问题。:) – rdrey 2012-07-23 14:36:45

+0

据我了解,mongo/mongoose缓冲'find'直到db重新连接。我相信它会尝试自动重新连接的默认选项。在特定的OP示例中,您需要检查您是否拥有有效的初始连接。 – dule 2013-11-07 13:33:37

7

这不是一个答案,但希望它能帮助你找到解决方案。具有非常相似的问题与 mongoose.createConnection 同时使用护照模块,发现它正常工作与 mongoose.connect

+2

如果可以的话,我会给这个+100。我一直试图解决这个问题几个小时。 – 2014-10-02 19:33:51

+0

非常感谢你。多年来我一直无法弄清楚。这个答案解释了不同之处http://stackoverflow.com/questions/22786374/queries-hang-when-using-mongoose-createconnection-vs-mongoose-connect#answer-22838614。我刚刚提交了一个问题https://github.com/Automattic/mongoose/issues/4413 – cortopy 2016-08-14 09:59:05

0

为了解决这个问题,你需要做的3项任务:

  1. 配置bufferMaxEntries:0在options.db部分(详细内容见here) 所以当禁用bufferMaxEntries这会导致猫鼬停止缓冲命令和重试送他们当服务器 下。

  2. 在options.db部分配置autoReconnect:false部分 在db级别禁用autoReconnet。 (查看详细信息here

  3. 如果您正在使用MongoDB的replicaset那么你需要在架构层面禁用bufferCommands工作(对创建的每个模式)

    VAR模式=新模式({..}, {bufferCommands:false});