Zarządzaj pulami połączeń mongo w jednym samodzielnym module. Takie podejście zapewnia dwie korzyści. Po pierwsze sprawia, że Twój kod jest modułowy i łatwiejszy do przetestowania. Po drugie, nie musisz mieszać połączenia z bazą danych w obiekcie żądania, który NIE jest miejscem dla obiektu połączenia z bazą danych. (Biorąc pod uwagę naturę JavaScript, uważam, że bardzo niebezpieczne jest mieszanie czegokolwiek z obiektem zbudowanym przez kod biblioteki). Dlatego wystarczy wziąć pod uwagę moduł, który eksportuje dwie metody. connect = () => Promise
a get = () => dbConnectionObject
.
Za pomocą takiego modułu możesz najpierw połączyć się z bazą danych
// 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);
});
Podczas lotu aplikacja może po prostu zadzwonić, get()
gdy potrzebuje połączenia DB.
const db = require('./myAwesomeDbModule');
db.get().find(...)... // I have excluded code here to keep the example simple
Jeśli skonfigurujesz moduł db w ten sam sposób, co poniżej, nie tylko zapewnisz, że aplikacja nie uruchomi się, chyba że masz połączenie z bazą danych, ale masz także globalny sposób na dostęp do puli połączeń z bazą danych, która spowoduje błąd jeśli nie masz połączenia.
// 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;
}