繁体   English   中英

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

[英]Sharing objects and avoiding globals in 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);

控制器/ 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实例来巧妙地回避这个问题。

这允许您创建一次连接(通常在app init上),并在需要时通过查询模型简单地使用它。

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

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连接包装在一个你需要的文件中来简化:

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

控制器/ users.js:

module.exports = function (app, state) {

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

};

正如@Jed Watson所建议的那样,moongoose模块使用单例(反?)模式,这种模式由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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM