缓存后如何处理MongoDB Client连接错误Mongo关闭?

时间:2017-04-28 09:43:33

标签: node.js mongodb node-mongodb-native

我创建了一个mongodb原生连接并将其保存,然后使用findOne查询文档。

const Promise = require("bluebird");
const MongoClient = require('mongodb').MongoClient;
let mongoDB = undefined;

const getCollection = (collName) => {
    if (mongoDB) {
        return Promise.resolve(mongoDB.collection(collName));
    } else {
        return MongoClient.connect(EXT_CONFS.MONGODB_URL)
            .then(db => {
                mongoDB = db;
                return Promise.resolve(mongoDB.collection(collName));
            }).catch(e => {
               console.error('Error in MongoDb connection');
            });
    }
};

const findOne = (collName, filter, options) => {
    return getCollection(collName)
        .then(collection => {
            return collection.findOne(filter, options);
        })
        .then(doc => {
            return Promise.resolve(doc);
        }).catch(e => {
            console.error(e);
            return Promise.reject(e);
        });
};

现在一切正常,但如果在缓存db客户端之后Mongo ShutsDown / Fails,则无法处理错误。错误永远不会进入任何catch处理程序:

  

console.error('MongoDb连接错误');

  

console.error(E);

我甚至尝试了一些事件:

 mongoDB.on('connecting', function () {
     console.log('connecting');
 });
 mongoDB.on('timeout', function (error) {
     console.log('timeout!');
 });
 mongoDB.on('close', function (error) {
     console.log('close!');
 });
 mongoDB.on('error', function (error) {
     console.error('Error in MongoDb connection: ' + error);
 });
 mongoDB.on('connected', function () {
     console.log('connected!');
 });
 mongoDB.on('connection', function () {
     console.log('connected!');
 });
 mongoDB.on('connect', function () {
     console.log('connected!');
 });
 mongoDB.once('open', function () {
     console.log('connection open');
 });
 mongoDB.on('reconnected', function () {
     console.log('reconnected');
 });
 mongoDB.on('disconnected', function () {
     console.log('disconnected');
 });

但仍未成功。使用NodeJS 4.5.0,MongoDB-Native驱动程序2.2.24

2 个答案:

答案 0 :(得分:0)

您应该执行console.error('Failed to connect to mongodb ',e);之类的操作,而不是输出错误。

此外,某些事件会提供一个附加参数,您也可以输出这些参数。如果无法连接到mongodb服务器,您的应用程序应该只通知您,这不是从应用程序使用守护程序(如systemd或其他进程监视)处理mongodb服务器启动/重启的最佳方法。

有些事件只是通知应用程序连接丢失或尝试重新连接,由您决定在发出这些事件时将要执行的操作。

例如,当重新连接对象发出断开连接事件时,您可以尝试检查mongodb状态。

答案 1 :(得分:0)

您可以将connect语句包装在try-catch块中。