Как обработать ошибку подключения клиента MongoDB после того, как он был кэширован, Mongo выключается?

Я создал собственное соединение 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);
        });
};

Теперь все это работает нормально, но если Mongo ShutsDown / Fails после кэширования клиента БД, невозможно обработать ошибку. Ошибка никогда не переходит ни к одному обработчику catch:

console.error('Ошибка подключения к MongoDb');

or

консоль.ошибка(е);

Я даже пробовал события:

 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


person vashishatashu    schedule 28.04.2017    source источник


Ответы (2)


Вы должны сделать что-то вроде console.error('Failed to connect to mongodb ',e);, вы не выводите ошибку.

Также некоторые события предоставляют дополнительный параметр, и вы их тоже выводите. В случае невозможности подключения к серверу mongodb ваше приложение должно просто уведомить вас, что это не лучший подход к запуску/перезапуску сервера mongodb из вашего приложения с использованием демонов, таких как systemd или другой мониторинг процессов.

Некоторые события предназначены для того, чтобы просто уведомить приложение о том, что соединение было потеряно или предпринята попытка повторного подключения, и вам решать, что будет сделано, когда эти события будут сгенерированы.

Например, вы можете попытаться проверить статус mongodb, когда событие отключения генерируется для воссоздания объекта соединения.

person Gntem    schedule 28.04.2017
comment
Я делаю console.error и даже пытался с помощью событий зафиксировать отключение, но это не работает, я никогда не получаю ни одной консоли. Какие события могут обрабатываться, пожалуйста, предоставьте рабочий образец, если это возможно. - person vashishatashu; 28.04.2017
comment
@vashishatashu были именно в вашем коде, вы добавляете прослушиватели событий, я полагаю, вы добавляете прослушиватели до того, как mongoDB будет назначено соединение с БД, добавьте слушателей после строки mongoDB=db, он должен выводить события - person Gntem; 28.04.2017
comment
@Mr.Pheonix: сделал то же самое, но ничего не произошло. Может получить отладчик до: return collection.findOne(filter, options); потом звонок так и не вернулся ни по событиям. - person vashishatashu; 28.04.2017

Вы можете обернуть оператор подключения в блок try-catch.

person Manuel Hernandez    schedule 27.05.2018