如何在Node.js中检查MongoDB连接是否正常

10
我有一个使用MongoDB作为后端的应用程序。当应用程序启动时,我建立连接,并在请求中使用它。
但是如果此时我的数据库连接失败(即mongod崩溃),我如何在请求时检查呢?
为了澄清一下:
- 目前我有一个"api.js",其中进行db.once('open', function../* setup */)操作。 - 在请求时,我执行db.find(conditions, function(err, res) { if (err) ...else ...})
我想要做的是在db.find()语句之前检查连接是否存活。因此,如果它已关闭,我可以尝试重新启动数据库连接。
附言:我知道,我应该设置某种连接池或类似的东西,而不是一直保持连接活跃,但现在它就是这样设置的。

1
假设在连接状态中检测错误的最快方法是首先尝试操作并重试失败 (https://dev59.com/tV_Va4cB1Zd3GeqPTnzo),那么您认为最优雅的封装重试的方式是什么? - Montagist
1个回答

9

您可以使用事件作为回调来处理它。
并且可能会有全局变量,用于标识它未连接。

您可以拥有一个单独的db.js文件,它将作为模块行为。您可以从中获取集合的函数。

var mongodb = require('mongodb');
var client;
var collections = { };

new mongodb.Db( ... ).open((function (err, c) {
  if (!err) {
    client = c;
    client.on('close', function() {
      client = null; // clear client
      collections = { }; // clear old collections
      // connection closed
    });
  } else {
    // error connecting
  }
});

// get collection
exports.get = function(name, callback) {
  if (client) {
    if (!collections[name]) {
      collections[name] = new mongodb.Collection(client, name);
    }
    callback(null, collections[name]);
  } else {
    // can perform reconnecting and then get collection and call callback
    callback(new Error('not connected'));
  }
}

所以要使用它:
var db = require('./db.js');

db.get('users', function(err, collection) {
  if (!err) {
    collection.find({ ...
  } else {
    console.log(err);
  }
});

对不起,我刚刚注意到您正在使用Mongoose,这可能会稍微有所不同。


1
这是我目前在做的 - 我执行的操作是,即users.find({}, function(err, res) { if (err).... else ...});。我想知道是否有一种方法可以在发送请求之前测试连接,以便首先尝试恢复连接。 - Zlatko
3
我不认为这完全回答了问题。你得到了一个错误提示,这个错误可能与连接无关,原因有很多种。 - Montagist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接