Я новичок в 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.