在Express中间件的任何路径中记录任何路径参数?

时间:2015-04-21 21:58:18

标签: node.js express

考虑以下明确申请:

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应用程序中任何路径的每个路径参数。

2 个答案:

答案 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]);
});