ExpressJS并在不同的路由文件之间传递变量

时间:2012-04-02 16:28:04

标签: javascript node.js express

我正在将ExpressJs与Node.js一起使用,并将所有路由放入'routes'文件夹。

在服务器上,我进行数据库连接,然后定义我的路由,如下所示:

var routes = require('./routes');

var db;
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
dbconnect.open(function (err, db) {

  db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) {
    if (success) {

      //routes/index.js
      app.get('/', routes.index);

      //routes/users.js
      app.get('/users', routes.users);

    }
  });
});

我想访问每个路由javascript文件中的'db'对象。我如何将这个'app.js'文件传递给index.js或users.js?

谢谢!

2 个答案:

答案 0 :(得分:13)

如果您在自己的文件/模块中编写数据库抽象,则可以根据需要在整个代码库中重复使用它,只需要在必要时使用require()。如果你正确地编写它就不会重新创建它,并且可以像你的例子一样在应用程序启动时初始化一次。

//contents of your database.js file
var database;

module.exports = {

    init : function(config, cb) {
        database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
        database.open(function (err, db) {  
            db.authenticate(config.mongo_user, config.mongo_pass, cb);
        });
    },

    query : function(params, cb) {
        database.query(params, cb);
    }   

};

这是一个微不足道的例子,但希望它能说明问题。在控制器或您需要该数据库对象的任何文件中,您只需...

var db = require('database');

db.init(params, function(err, db) {
    ...
});


db.query(params, function(err, db) {
    ...
});

好处是,您现在拥有一个松散耦合的数据库对象,可以像应用任何其他节点模块一样通过require语句在应用程序的任何位置使用。

答案 1 :(得分:4)

一个建议是通过接受db参数的函数公开您的路线:

routes.js:

module.exports = function(db) {
    return {
        index: function(req, res, next) {
            // Funky db get stuff
        }
    }
}

在这样的闭包中包装值并返回具有更多函数的对象是一种有用的模式,有时称为“显示模块模式”。它清楚地显示了依赖关系,允许在使用灵活的功能方法的同时轻松进行测试(使用例如模拟数据库对象)。