使用全局variables在模块之间共享数据库

我正在使用“mongodb”模块工作在nodejs / mongodb应用程序上。 该应用程序与启动

node main.js 

在main.js中,我连接到数据库,并保持连接在'db'全局variables。 'db'然后用在'server'的内部方法中。 我想避免将'db'作为全局variables,但是没有find正确的方法。

我目前的main.js:

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

任何想法更清洁的方式?

UPDATE

我终于在connection.js中创build了一个模块:

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

每当我需要获得连接,我打电话:

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

这工作得很好。

任何潜在的失败,这种方法?

我通常会包含一个项目实用程序文件,其中包含许多这些内容,只是为了方便起见。 它作为一个伪全局函数,但没有很多全局性的常见问题。

例如,

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

通过使用asynchronous的initialize()函数,可以确保在启动服务器之前完成所有数据库连接,文件I / O等。

你可以创build一个类似于提供者的包装器,并把它放在provider.js中。

 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; 

这是你如何使用提供者:

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