【问题标题】:Mongoose Model.find() hangs when not connected to databaseMongoose Model.find() 在未连接到数据库时挂起
【发布时间】:2012-07-21 10:40:33
【问题描述】:

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

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

【问题讨论】:

  • 显示实现您在BlogPost 上调用的find 方法的代码。
  • @ebohlman BlogPost 是猫鼬模型(我更新了代码)。

标签: node.js mongodb mongoose


【解决方案1】:

由于您已经在 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() 接受这些选项,但我可能是错的。

【讨论】:

  • 服务器启动后数据库宕机了怎么办?初始连接会成功,但以后不会像我上面描述的那样调用find() 阻塞吗?
  • 我做了更多的研究,见编辑。但是在我以后可以测试您的问题之前,请对此持保留态度。 :)
  • 据我了解,mongo/mongoose 正在缓冲find,直到数据库重新连接。我相信默认选项会尝试自动重新连接。在特定的 OP 示例中,您需要检查是否有有效的初始连接。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

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

  3. 如果您使用的是 mongodb 副本集,那么您需要在架构级别禁用 bufferCommands(对于您创建的每个架构)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2018-07-21
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多