快递中间件访问req.params

我想隔离一段代码,检查req.paramsreq.body是否需要每个请求的值。 我发现,如果我尝试访问app.use(app.router)之前的这些值,然后请求尚未被parsing,包括这些对象。 如果我尝试 app.use(app.router)之后插入中间件那么它会一起跳过。

我可以做些什么来在一个地方处理这些值,以便下游路线和模型可以使用这些工作?

你不能做你想做的事情。 https://github.com/strongloop/express/issues/2088非常清楚地解释了这一点。

我一直在努力做你想做的一段时间,没有成功。 我终于在github中追踪了这个问题。

只要在每条路线上运行中间件,

 const middleware = (req, res, next) => { console.log(req.params.id); next(); }; app.get('/test/:id', middleware, (req, res) => { res.send('hi'); }); 

由于我原来的答案不会从URL获取路由参数,例如/things/:foo (虽然它会得到querystring和req.body params),但是它不会按照我们想要的方式工作。 但是另一种select是编写一个包装函数来完成你所需要的,并将其应用到你的路由中间件:

 function checkForParam (fn) { return function(req, res, next) { if (req.param('foo') != 'bar') { return res.send(403, 'No way Jose!'); } fn (req, res, next); }; } 

然后添加路线:

 app.get('/things/:foo', checkForParam(function(req, res, next) { // your middleware code here }); 

这将运行检查,并只有通过调整才能继续到您的自定义路由中间件。

还有一个问题:你使用Express v。3或4吗?

这在这里是非常重要的,因为在第4节中的概念是不同的(又好一些)。

例如https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x

app.use(app.router); // <—这一行将被删除

而不是尝试通过自定义中间件来做到这一点,您可以简单地添加一个通配符路由,它将始终在其他路由之前运行,并检查其中的参数:

 app.get('/*', function(req, res, next) { if (req.param('foo')) { // Do something return next(); // or return res.send(403, 'no way!'), or whatever. } return next(); });