在node.js中共享对象并避免全局性

在我的路由器/控制器中,在下面的片段( dbvariables)中共享数据库连接的最合适的方式是什么,而不将dbvariables转换为全局variables?

 var mongo = require('mongoskin'), db = mongo.db(config.db.adress); app.use(function(req, res, next) { db.open(function(err, data) { (err) ? res.send('Internal server error', 500) : next(); }); }); // Setting up controllers here app.post('/users', require('./controllers/users').create); 

来自PHP的背景,我来思考dependency injection ,但我不知道如果这是适当的节点。

试试看这样:

app.js:

 var mongo = require('mongoskin'), db = mongo.db(config.db.adress); app.use(function(req, res, next) { db.open(function(err, data) { (err) ? res.send('Internal server error', 500) : next(); }); }); require('./controllers/users')(app, db); 

控制器/ users.js:

 module.exports = function (app, db) { app.post('/users', function(req, res, next) { // Your create function // Link to db exists here }); }; 

我对mongoskin没有任何经验,但是Mongoose整齐地回避了这个问题,每当你需要的时候都返回一个Mongoose的Singleton实例。

它允许你创build一个连接(通常是在应用程序初始化时),并在需要时通过查询模型来简单地使用它。

它也允许你像这样定义你的模型:

 var mongoose = require('mongoose'), TodoSchema = new mongoose.Schema({ title: { 'type': String, 'default': 'empty todo...' }, order: { 'type': Number }, done: { 'type': Boolean, 'default': false } }); mongoose.model('Todo', TodoSchema); 

然后在任何需要的地方使用它们:

  var mongoose = require('mongoose'), Todo = mongoose.model('Todo'); 

有关Mongoose如何工作的更多信息,可以在这里find示例代码。

从mongoskin的文档看来,每次要使用它时都需要连接,你可以通过将db连接包装在一个你可能需要的文件中来简化它:

db.js

 exports.db = require('mongoskin').db('myProject-' + process.env.NODE_ENV); 

用它:

 var db = require('./db'); db.open(function(err, data) { (err) ? res.send('Internal server error', 500) : next(); }); 

上面的方法,其中数据库作为parameter passing给每个可能需要它的函数,导致callback汤,应尽可能避免。

我最终使用了Vadim Baryshev的答案,并通过创build一个持有常用模块的State模块来进一步深化,以保持整洁:

state.js:

 module.exports = { mongo: require('mongoskin'), db: require('mongoskin').db('myProject-' +process.env.NODE_ENV ) } 

app.js:

 var state = require('./state'); require('./controllers/Users')(app, state); 

控制器/ users.js:

 module.exports = function (app, state) { app.post('/users', function(req, res, next) { state.db.find({}, function(doc, err) {}); }); }; 

正如@Jed Watson所build议的那样,moongoose模块使用一个singleton(反?)模式,它由require / export机制强制执行。 这里是代码的特定位:

(在这里find: https : //github.com/LearnBoost/mongoose/blob/master/lib/index.js )

 /*! * The exports object is an instance of Mongoose. * * @api public */ var mongoose = module.exports = exports = new Mongoose;