Express js从URL的root获取参数(不像req.params那么简单)
Express js get parameters from root of URL (Not as simple as 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/:test 并注销您在 req.params.
中替换 :test 的任何内容
第二个url有子路由的是:/api/test/:test/:test2, 但是当你发送你的 get 请求时 只有 :test2 出现在 req.params.
似乎如果您使用此模式,路由 'root' 中的任何变量(即在主路由器中)都不会被拾取。
有办法解决这个问题吗?
谢谢
您需要一个中间件来为您修复此问题:
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'));
express.js (>= v4.5.0+) 提供了直接的解决方案,无需实现中间件。
https://expressjs.com/en/api.html#express.router
创建路由器时,传递 mergeParams
标志。
var router = express.Router({ mergeParams: true })
mergeParams
保留来自父路由器的 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/:test 并注销您在 req.params.
中替换 :test 的任何内容第二个url有子路由的是:/api/test/:test/:test2, 但是当你发送你的 get 请求时 只有 :test2 出现在 req.params.
似乎如果您使用此模式,路由 'root' 中的任何变量(即在主路由器中)都不会被拾取。
有办法解决这个问题吗?
谢谢
您需要一个中间件来为您修复此问题:
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'));
express.js (>= v4.5.0+) 提供了直接的解决方案,无需实现中间件。 https://expressjs.com/en/api.html#express.router
创建路由器时,传递 mergeParams
标志。
var router = express.Router({ mergeParams: true })
mergeParams
保留来自父路由器的 req.params 值。如果父项和子项的参数名称冲突,则子项的值优先。