ExpressJS - 带参数的路由器模块

时间:2016-11-27 11:24:56

标签: node.js express

我已经玩了几天NodeJS和Express,这很酷。但是我遇到了一个我无法理解的问题,所以我希望那里的其他人可以帮助我解决这个问题。

我知道我可以声明一个模块,然后通过require方法将参数传递给这个模块。

--- 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();
     }
}

我认为这比在每个需要使用它的模块中需要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()需要中间件,得到一个未定义的”。我可以看看这个错误来自哪里,(module.exports没有返回一个对象)但是我如何构建我的代码以便我可以将参数传递给最终将导出路由器中间件的模块?我想在一个地方要求并初始化Foo,然后将其传递给使用它的所有路由器模块。有可能吗?

1 个答案:

答案 0 :(得分:1)

你几乎得到了它,你只需要返回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;
}

注意额外的;和返回。

我还将路由器的实例化移动到了函数中。在节点模块中cached,您可以多次需要相同的模块,它们将共享其全局变量。这可能会导致意外结果。在您的情况下,您每次都会覆盖router.get处理程序,并且Foo的相同实例将用于每个请求。