2012-04-02 87 views
10

我使用ExpressJs和Node.js,并把我所有的路由放到'路由'文件夹中。ExpressJS并在单独的路由文件之间传递变量

在服务器上,我做我的DB连接,然后确定我的路线,像这样:

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?

谢谢!

回答

4

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

routes.js:

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

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

+4

缺点是现在每次你想在控制器中重复使用一个“模块”时,你必须将它添加到签名中,最后可能会出现一些控制器需要2个,一个需要3个,另一个需要5个的情况,现在你已经有了一个必须容纳最大共同点的签名。我认为更好的方法是将你的数据库行为封装在它自己的松耦合模块中。 – 2012-04-02 20:43:19

+2

@BradHarris:这绝对是一个缺点。如果您觉得这一点很重要,那么保留相同签名的一种方法是接受带有参数的对象:'{db:db,foo:foo,bar:bar}'。你的解决方案绝对不是一个很好的解决方法,尽管它有自己的缺点 - 比如单元测试更难。 – 2012-04-25 16:30:10

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) { 
    ... 
}); 

的好处是,你现在可以在任何地方使用你的应用程序一样,通过任何其他节点模块松耦合的数据库对象要求声明。

+2

我喜欢这个。另一个有用的模式是将一个对象表示为应用程序(或应用程序资源)作为对象。例如。 require('./ myapp.js')。db或require('./ myapp.js')。config – Prestaul 2012-04-02 21:06:37