Normalmente, incluo um arquivo de utilitários de projeto que contém várias dessas coisas, apenas para facilitar. Funciona como um pseudo global, mas sem muitos dos problemas usuais que os globais acarretam.
Por exemplo,
projectUtils.js
module.exports = {
initialize: function(next){
// initialization actions, there can be many of these
this.initializeDB(next);
},
initializeDb: function(next){
mongoClient.open(function(err, mongoClient) {
if(err) return next(err);
module.exports.db = mongoClient.db(DB);
next();
});
}
}
app.js
var projectUtils = require('projectUtils');
// (snip)
projectUtils.initialize(function(err) {
if(err) throw err; // bad DB initialization
// After this point and inside any of your routes,
// projectUtils.db is available for use.
app.listen(port);
}
Usando uma função assíncrona initialize(), você pode ter certeza de que todas as conexões de banco de dados, E/S de arquivo, etc., são feitas antes de iniciar o servidor.