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

我已经做了一个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}); }; 

因此,没有子路由的第一个url是: / api / test2 /:testing并注销你放置的所有内容:test在req.params中。

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

看来,如果你使用这个模式,路由的“根”(即在主路由器)中的任何variables都不会被拾取。

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

谢谢

你将需要一个中间件来解决这个问题:

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

然后在你上次的callback函数中使用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'));