ExpressJS – 带参数的路由器模块

我一直在玩NodeJS和Express几天,这很酷。 但是我遇到了一个问题,我无法摆脱困境,所以我希望有其他人能够帮助我解决这个问题。

我知道我可以声明一个模块,然后通过require方法将parameter passing到这个模块中。

 --- App.js ---- var foo = require('./modules/Foo.js'); foo.config(); var bar= {} require('./modules/Bar.js)(bar, foo) --- Bar.js --- module.exports = function(Bar, Foo) { Bar.act = function(){ Foo.do(); } } 

我认为这是一个更清洁的devise,而不是在需要使用它的每个模块中都需要Foo 。 我也不需要在每个需要它的模块中进行初始化。

但是,那么Router ,我真的不明白它是如何工作的。 大多数例子都需要每个模块中的路由器,如下所示:

 --- App.js ---- var index = require('./views/index.js'); app.use('/', index); --- Index.js --- var express = require('express'); var router = express.Router(); var foo = require('../modules/Foo.js); foo.config(); router.get('/', function (req, res) { foo.do(); res.render('index'); }) module.exports = router 

但是,那么我需要手动使用index.js所有模块。 我真正想要做的是这样的:

 --- App.js ---- var foo = require('../modules/Foo.js); foo.config(); var index = require('./views/index.js')(foo); app.use('/', index); --- Index.js --- var express = require('express'); var router = express.Router(); module.exports = function(foo){ router.get('/', function (req, res) { foo.do(); res.render('index'); }) } 

但是这样写,编译器告诉我“Router.use()需要中间件,得到了一个未定义的”。 我可以sorta看看这个错误来自哪里( module.exports不返回一个对象),但是如何构造我的代码,以便我可以传递参数到一个模块,最终将导出一个路由器中间件? 我想在一个地方要求并初始化Foo ,然后将它传递给所有使用它的路由器模块。 有没有可能?

你几乎可以得到它,你只需要返回Router

一个固定的index.js可能看起来像这样:

 var express = require('express'); module.exports = function(foo){ var router = express.Router(); router.get('/', function (req, res) { foo.do(); res.render('index'); }); return router; } 

注意额外的; 和回报。

我也将路由器的实例化移到了函数中。 在节点中caching模块,你可以多次需要相同的模块,它们将共享它们的全局variables。 这可能会导致意想不到的结果。 在你的情况下,你将每次覆盖router.get处理程序,同一个Foo实例将被用于每个请求。