【问题标题】:ExpressJS - router module with parametersExpressJS - 带参数的路由器模块
【发布时间】:2016-11-27 11:24:55
【问题描述】:

我已经玩了几天 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,然后将它传递给所有使用它的路由器模块。有没有可能?

【问题讨论】:

    标签: node.js express


    【解决方案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 实例。

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      相关资源
      最近更新 更多