Express js从URL的根目录获取参数(不像req.params那么简单)

时间:2015-07-20 21:20:54

标签: javascript node.js express url-routing

我已经制作了一个api,我按照以下方式发送了它:

在主要路线档案中:

  //with sub-route
  app.use('/api/test/:test', require('./api/test'));

  //Without sub-route
  app.use('/api/test2/:test', function(req, res){
    console.log('in test', req.params, req.body);
    return res.status(200).json({params: req.params, body: req.body});
  });

访问第二条路线会按照预期显示:req.params中的:test。

在模块化路径文件夹('./api/test')中,我有一个子路由器(index.js),如下所示:

router.get('/:test2', controller.getItem);

使用处理程序:

exports.getItem = function getItem(req, res) {
  console.log('in getItem \nreq.params', req.params, '\nreq.body: ', req.body);
  return res.status(200).json({yes: 'yes', params: req.params, body: req.body});
};

所以没有子路由的第一个网址是: / api / test2 /:test 并注销你放置的任何内容:test in req .params。

具有子路由的第二个网址是: / api / test /:test /:test2 ,但是当您发送获取请求时:test2出现在req.params

似乎如果你使用这种模式,路线的“根”(即主路由器)中的任何变量都不会被选中。

有没有办法解决这个问题?

由于

2 个答案:

答案 0 :(得分:2)

您需要一个中间件来为您解决此问题:

function paramFix(req, res, next) {
    req._params = req.params;
    next();
}
app.use('/api/test/:test', paramFix, require('./api/test'));

然后在上一个回调函数中使用req._params.test

因此,反映多个级别的安装,您可以像这样扩展您的中间件:

function paramFix(req, res, next) {
    req._params = req._params || {};
    for (var key in req.params) {
        if (req.params.hasOwnProperty(key)) {
            req._params[key] = req.params[key];
        }
    }
    next();
}
app.use('/api/test/:test', paramFix, require('./api/test'));

答案 1 :(得分:0)

express.js(> = v4.5.0 +)提供了直接解决方案,而无需实现中间件。 https://expressjs.com/en/api.html#express.router

在创建路由器时,请传递mergeParams标志。

var router = express.Router({ mergeParams: true })

mergeParams保留父路由器的req.params值。如果父母和孩子的参数名称冲突,则以孩子的值为准。