Javascript ExpressJS和在单独的路由文件之间传递变量

Javascript ExpressJS和在单独的路由文件之间传递变量,javascript,node.js,express,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(fun

我将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


谢谢大家!

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

routes.js:

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

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

如果您在自己的文件/模块中编写数据库抽象,那么您可以根据需要在整个代码库中重复使用它,只需在需要的地方进行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语句使用的任何其他节点模块一样。

缺点是,每次您要跨控制器重用“模块”,都必须将其添加到签名中,你可能会遇到这样的情况,一些控制器需要2个,一些控制器需要3个,一个控制器需要5个,现在你有了一个签名,它必须容纳最大的公分母。我认为更好的方法是将db行为封装在它自己的松散耦合模块中。@Bradharis:这肯定是一个缺点。如果您觉得这很重要,保持相同签名的一种方法是接受一个带有参数的对象:
{db:db,foo:foo,bar:bar}
。您的解决方案绝对不是一个解决它的坏方法,尽管它有自己的缺点——例如,单元测试比较困难。我喜欢这个。另一个有用的模式是将应用程序(或应用程序资源)表示为对象的对象。例如,require('./myapp.js').db或require('./myapp.js').config