ExpressJS并在单独的路由文件之间传递variables

我使用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?

谢谢!

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

routes.js:

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

将值封装在像这样的闭包中,并返回具有更多function的对象是一种有用的模式,有时称为“揭示模块模式”。 它清楚地显示了依赖关系,可以轻松地进行testing(例如使用模拟db对象),同时仍然使用灵活的function方法。

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

 //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语句。