考虑以下明确申请:
var app = require('express')();
app.use(function(req, res, next) {
console.log(req.params); // Logs {}
next();
});
app.get('/:id', function(req, res) {
res.send({id: req.params.id})
});
app.listen(3000);
为什么中间件无法访问路径参数?我想要一个中间件来记录Express应用程序中任何路径的每个路径参数。
答案 0 :(得分:1)
问题是您的中间件功能没有与之关联的网址,因此它会获得默认网址 - '/'
。在那个网址中没有任何路径参数。
您必须将您的功能用作您定义的每个网址的中间件。像这样:
function logger(req, res, next) {
console.log(req.params);
next();
}
app.get('/:id', logger, function(req, res) {
res.send({id: req.params.id})
});
答案 1 :(得分:0)
虽然@НиколайКараджов建议的方式可行,但还有一种“快速方式”可以做到这一点。请参阅下面的代码和解释。
function extractParams(req, res, next, id) {
req.id = id;
next();
}
app.param('id', extractParams);
app.get('/:id', function(req, res) {
res.send({id: req.id});
});
Express在您的快速应用程序中提供param
方法,它将“拦截”任何匹配的请求参数('id')并运行提供的中间件例程(在我们的例子中为extractParams
)。
在extractParams
中间件中对您的请求参数执行任何操作 - 我们只是将id参数附加到请求对象,并使用我们想要的任何键('id')。
然后我们可以触发下一个路由处理程序(next()
)。
因此,在您的app.get('/:id')
回调函数中,您可以直接从请求对象访问'id',因为您在进入此路由处理程序之前将其附加到中间件中。如果在将信息传递给下一个函数之前需要对params做很多事情,这可能会非常强大。
编辑:根据您的澄清评论,请尝试以下操作,它将匹配任何参数,然后在处理程序中将其注销。
app.get('/^(.*)$/', function(req, res, next) {
console.log(req.params[0]);
});