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



在不将db变量转换为全局变量的情况下,与我的路由器/控制器共享以下代码段中的数据库连接(db变量)的最合适方式是什么?

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背景,我开始考虑依赖注入,但我不知道这在节点中是否合适。

试着这样看:

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

controllers/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实例。

这允许您创建一次连接(通常在应用程序初始化上),并在需要时通过查询模型来使用它

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

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如何像这样工作的更多信息,以及示例代码,可以在这里找到答案。

从mongoskin的文档来看,每次你想使用它时,似乎都必须进行连接,你可以通过将数据库连接封装在一个你可能需要的文件中来简化它:

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

上面的方法将db作为参数传递给可能需要它的每个函数,这会导致回调汤,如果可能的话应该避免。

我最终使用了Vadim Baryshev的答案,并进一步创建了一个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);

controllers/users.js:

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

正如@Jed Watson所建议的,moongoose模块使用singleton(anti?)模式,该模式由require/export机制强制执行。这是特定的代码位:

(如下所示: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;

相关内容

  • 没有找到相关文章

最新更新