Node.js Исключение исключения драйвера MongoDB асинхронно - PullRequest
0 голосов
/ 03 ноября 2019

Я новичок в node.js. И возникли проблемы с использованием драйвера MongoDB в стиле обещания. У меня есть класс для совместного использования соединения:

MongoConnection.js

/**
 * Singleton Class Creating MongoDB Connection
 */
class MongoConnection {
    constructor (url, options) {
        if(!MongoConnection.instance) {
            this.client = new MongoClient(url, options);
            this.connect = this.client.connect();
            MongoConnection.instance = this;
        }
        return MongoConnection.instance;
    }
}

module.exports = { MongoConnection };

Затем я включаю его в основное приложение

приложение. js

const { MongoConnection } = require('./libs/classes/MongoConnection');
const url = 'mongodb://user:pass@localhost:27017/SecretDB';
const options = {
    .....
};

const mongoClient = new MongoConnection(url, options);

.....


// Connecting to MongoDB
mongoClient.connect.then(() => {
    app.listen(PORT, HOST, () => {
        const timeStart = Date();
        console.info(`${timeStart} -`, 'Server started at:', `http://${HOST}:${PORT}`);

    });
})
    .catch((err) => {
        console.error('Couldn\'t establish database connection. Quiting the Server');
        process.exit(1);
    });

После того, как соединение с базой данных установлено, я использую его в методе класса. Этот метод возвращает обещание, подобное этому

ModelClass.js

Some validation
const result = {...} // Object used as a result with errors during validation
......

// Trying to connect to Database
return this.mongo.connect.then(() => {
    try {
        const doc  = { user: this.login, password: this.password };
        const db   = this.mongo.client.db('SecretDB');        
        const coll = db.collection('users');
        coll.insertOne(doc, (err, result) => {
            if(err) throw err;
        });
        return result;
    }
    catch (err) {
        throw err;
    }
})
    .catch((err) => {
        console.error(err);
        errors.server = 'Internal Server Error';
        result.errors = errors;
        result.success = false;
        return result;
    });

.......

Возвращенное обещание используется в контроллере маршрутизации Express, подобном этому

Controller.js

const promiseResult = Obj.method();

promiseResult.then((result) => {

    if (!result.success) {        
        next(new Error(result));
    }
    else {
        try {
            res.render(
                .....
            );
        }
        catch (e) {
            throw e;
        }
    }
})
    .catch((err) => {
        try {
            res.render(
                .....
            );
        }
        catch (e) {
            next(new Error(err));
        }
    });

Все в порядке, пока не возникнут проблемы с подключением к Mongo Server. Например, если доступ к «SecretDB» ограничен, происходит сбой всего приложения:

ModelClass.js

const db   = this.mongo.client.db('SecretDB'); // Exception here crashes the whole app.
...