10

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

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

3 回答 3

6

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

于 2012-12-12T23:47:32.620 回答
4

由于您已经在 connect 调用中使用了错误处理程序,因此明智的做法是在数据库未启动时退出您的应用程序,或者激活一些以 pretty 响应的中间件500 Internal Server Error

Mongoosenode-mongodb-native在后台使用 mongodb 连接,您可能会在其中找到其他有用的连接选项。:)

编辑:尝试设置socketOptions.socketTimeoutMS。显然没有设置默认超时。请参阅http://mongodb.github.com/node-mongodb-native/api-generated/server.html

我的工作机器上没有 node 可以为您尝试确切的语法,但您可能必须使用mongoose.Connection,它有一个open()方法可以接受传递给的选项node-mongodb-native。我不认为mongoose.connect()接受这些选项,但我可能是错的。

于 2012-07-23T12:42:19.450 回答
0

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

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

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

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

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

于 2016-12-12T17:19:38.057 回答