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'));