Керуйте пулами підключення mongo в одному самодоступному модулі. Такий підхід забезпечує дві переваги. По-перше, він зберігає ваш код модульним і простішим для тестування. По-друге, ви не змушені змішувати підключення до вашої бази даних в об'єкт запиту, який НЕ є місцем для об'єкта підключення до бази даних. (Враховуючи природу JavaScript, я вважаю дуже небезпечним змішувати що-небудь до об'єкта, побудованого за кодом бібліотеки). Тож з цим вам потрібно розглянути лише модуль, який експортує два методи. connect = () => Promise
і get = () => dbConnectionObject
.
За допомогою такого модуля ви можете спочатку підключитися до бази даних
// runs in boot.js or what ever file your application starts with
const db = require('./myAwesomeDbModule');
db.connect()
.then(() => console.log('database connected'))
.then(() => bootMyApplication())
.catch((e) => {
console.error(e);
// Always hard exit on a database connection error
process.exit(1);
});
Під час польоту ваш додаток може просто зателефонувати, get()
коли йому потрібно з'єднання з БД.
const db = require('./myAwesomeDbModule');
db.get().find(...)... // I have excluded code here to keep the example simple
Якщо ви налаштуєте модуль db таким же чином, як наступний, не тільки ви матимете спосіб гарантувати, що ваша програма не завантажиться, якщо ви не підключитесь до бази даних, у вас також буде глобальний спосіб доступу до пулу підключення до вашої бази даних, що призведе до помилки якщо у вас немає зв’язку.
// myAwesomeDbModule.js
let connection = null;
module.exports.connect = () => new Promise((resolve, reject) => {
MongoClient.connect(url, option, function(err, db) {
if (err) { reject(err); return; };
resolve(db);
connection = db;
});
});
module.exports.get = () => {
if(!connection) {
throw new Error('Call connect first!');
}
return connection;
}