【问题标题】:How to check if MongoDB connection is alive in Node.js如何在 Node.js 中检查 MongoDB 连接是否处于活动状态
【发布时间】:2014-03-13 00:28:07
【问题描述】:

我有一个以 MongoDB 作为后端的应用程序。当应用程序启动时,我会设置连接并稍后在请求时使用它。

但如果同时我的数据库连接失败(即 mongod 崩溃),我如何在请求时间检查?

澄清一下:

  • 目前我有一个“api.js”,它是db.once('open', function../* setup */)
  • 应要求,我会db.find(conditions, function(err, res) { if (err) ...else ...})

我想要做的是在db.find() 子句之前检查连接是否存在。所以如果它挂了,我可以尝试重新启动数据库连接。

附:我知道,我可能应该设置某种连接池或类似的东西,而不是一直保持连接处于活动状态,但现在它已按原样设置。

【问题讨论】:

  • 好的,假设检测连接状态错误的最快方法是首先尝试操作并重试失败 (stackoverflow.com/questions/8936922/…) 封装该重试的最优雅方式是什么,你觉得呢?

标签: node.js mongodb mongoose


【解决方案1】:

您可以使用事件来处理它作为回调。
并且可能有你的全局变量来识别它没有连接。

您可以拥有单独的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,可能会略有不同。

【讨论】:

  • 这就是我目前所做的——我做的,即。 users.find({}, function(err, res) { if (err).... else ...});.我想知道是否有一种方法可以在发送请求之前测试连接,以便我首先尝试恢复连接。
  • 我根本看不出这是如何解决这个问题的。你得到一个错误。这个错误可能是由于很多事情造成的,并不是所有的事情都涉及到连接。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2019-12-10
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多