utiliser une variable globale pour partager la firebase database entre les modules

Je travaille sur une application nodejs / mongodb en utilisant le module ‘mongodb’. L’application est lancée avec

node main.js 

Dans main.js, je me connecte à la firebase database et conserve la connexion dans la variable globale ‘db’. ‘db’ est ensuite utilisé dans les méthodes internes de ‘serveur’. Je veux éviter d’avoir ‘db’ comme variable globale mais je n’ai pas trouvé la bonne façon de le faire.

Mon main.js actuel:

 var server = require('./lib/server'); var MongoClient = require('mongodb').MongoClient; var Server = require('mongodb').Server; var mongoClient = new MongoClient(new Server(HOST, PORT)); db = null; // Database connection mongoClient.open(function(err, mongoClient) { if(!err){ // Database selection db = mongoClient.db(DB); // Launch web server server.start(); // usage of 'db' in this part } else { console.log(err.message); process.exit(1); } }); 

Une idée d’une manière plus propre?

METTRE À JOUR

J’ai finalement créé un module dans connection.js:

 var config = require('../config/config'); var url = 'mongodb://' + config.db.host + ':' + config.db.port + '/' + config.db.name; var MongoClient = require('mongodb').MongoClient; var db = null; module.exports = function(cb){ if(db){ cb(db); return; } MongoClient.connect(url, function(err, conn) { if(err){ console.log(err.message); throw new Error(err); } else { db = conn; cb(db); } }); } 

Chaque fois que je dois obtenir la connexion, j’appelle:

 var connection = require('./connection'); connection(function(db){ // doing some stuff with the db }); 

Cela fonctionne très bien.

Un échec potentiel avec cette approche?

J’inclus généralement un fichier d’utilitaires de projet contenant un certain nombre de ces éléments, juste pour faciliter les choses. Il fonctionne comme un pseudo global, mais sans beaucoup des problèmes habituels que les globals impliquent.

Par exemple,

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); } 

En utilisant une fonction asynchrone initialize (), vous pouvez être sûr que toutes les connexions à la firebase database, les E / S de fichiers, etc. sont effectuées avant le démarrage du serveur.

Vous pouvez créer un wrapper qui ressemble à un fournisseur et le placer dans provider.js, par exemple.

 Provider = function (db_name, host, port, username, password) { var that = this; var conn = generate_url(db_name, host, port, username, password); // you need to implement your version of generate_url() MongoClient.connect(conn, function (err, db) { if (err) { throw err; } that.db = db; }); }; //add the data access functions Provider.prototype.getCollection = function (collectionName, callback) { this.db.collection(collectionName, collectionOptions, callback); }; exports.Provider = Provider; 

Voici comment vous utilisez le fournisseur:

 var db = new Provider(db_name, host, port, username, password); db.getCollection('collection name', callback);