使用名称数组

时间:2015-04-22 09:52:54

标签: javascript express

我尝试使用router.param方法初始化多个快速路由器参数。这是路由器代码段:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

router.param(['foo','bar'], function(req,res,next,foo,bar){
  req.myvars = {
    foo: foo,
    bar: bar
  };
  console.log('initialized params: foo==%s, bar==%s', foo, bar);
  return next();
});

router.get('/myvars/:foo/:bar',function(req,res,next){
  var foo = req.myvars.foo;
  var bar = req.myvars.bar;
  console.log('router.get: foo==%s, bar==%s', foo, bar);
  res.json(req.myvars);
});

module.exports = router;

我在浏览http://localhost:3000/myvars/a/b时收到错误消息:无法读取属性' foo'未定义。此外,我的控制台窗口显示'已初始化的参数'像我预期的那样。 router.param是不是被调用了?如何正确使用router.param方法?我在网上看到很多例子(eg. API example使用router.param只有一个单个名称:有人可以给出一个代码示例,使用带有名称数组的router.param

如果有必要,这是我的package.json依赖项。

"dependencies": {
    "express": "~4.8.6",
    "body-parser": "~1.6.6",
    "cookie-parser": "~1.3.2",
    "morgan": "~1.2.3",
    "serve-favicon": "~2.0.1",
    "debug": "~1.0.4",
    "jade": "~1.5.0"
}

2 个答案:

答案 0 :(得分:2)

查看Express路由器代码,它实际上并不接受一个名称数组(即使文档建议这样做)。

您可以使用以下方法解决问题:

var handler = function(req, res, next, value, key) {
  req.myvars = req.myvars || {};
  req.myvars[key] = value;
  next();
};

router.param('foo', handler);
router.param('bar', handler);

答案 1 :(得分:0)

它确实支持数组,但你无法同时解析这两个参数。如果你再看一下文档。

router.param(['id', 'page'], function (req, res, next, value) {
  console.log('CALLED ONLY ONCE with', value);
  next();
})

您必须在每个样式的a中访问它们的值。另外我不知道为什么你会返回next()。我不认为它会导致任何问题,但只需调用next()并让函数自行终止。