快递中间件无法获取请求参数

我无法读取我的中间件中的任何请求。 我有一个最小的快速Web服务器,看起来像

'use strict'; var express = require('express'); var app = express(); //middleware function userMiddleware(req, res, next) { console.log('user came in. Hello ' + req.param('name')); next(); } //register middleware app.use('/user', userMiddleware) // routes app.get('/user/:name', function(req, res) { res.send('username : ' + req.params.name); }); app.listen(3000); console.log("listening on 3000..."); 

当我尝试打本地主机:3000 /用户/威廉姆斯,我期望在日志中看到:

 user came in. Hello williams 

但我明白了

 user came in. Hello undefined 

我是否应该包含任何其他中间件,以便将req.params填充到中间件中? 我正在使用express@3.3.4

我认为app.param()在这种情况下是非常规的,不是很直观。 由于我已经有了代表中间件的function,所以我可以这样做:

 //middleware function userMiddleware(req, res, next) { console.log('user came in. Hello ' + req.params.name); next(); } // routes app.get('/user/:name', userMiddleware, function(req, res) { res.send('username : ' + req.params.name); }); 

编辑

我下面的答案是不正确的。 你实际上不需要jsonurlencoded中间件来获取路由参数 – 只有req.queryreq.body才能工作。 如你所知(因为你是那里的海报之一),你在评论中提供的链接描述了这个问题:

https://github.com/strongloop/express/issues/2088

问题是你试图在路由参数存在之前访问 – 中间件在路由之前运行。 一个解决scheme是使用app.param()中build议的链接(而不是你的userMiddleware ):

 app.param('name', function(req, res, next, name) { console.log('user came in. Hello ' + name); next(); }); 

请注意,这将在所有路由中findname参数,因此您可能想要将参数命名为更具体一些,如username 。 你也可以检查req.url的开头,如果你想缩小这种方式。

顺便一提使用req.param()就像你在原来的代码一样应该避免; 引用快速文档: Direct access to req.body, req.params, and req.query should be favoured for clarity - unless you truly accept input from each object.


老解答

因为它包含可能在其他情况下可能有用的信息,所以留在这里

我相信你需要添加这个中间件才能使GET和POSTvariables可用:

 .use(express.json()) //support JSON-encoded bodies .use(express.urlencoded()) //support URL-encoded bodies 

和:

 .use(express.methodOverride()) 

如果您还需要在所有浏览器中使用HTTP动词,如PUT或DELETE。

除了jsonurlencoded ,您可以使用bodyparser ,但由于file upload,这可能是一个安全漏洞。 请参阅http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html 。 而且, bodyparser在Express 4中bodyparser被废弃了。注意,如果你想支持file upload,你需要使用额外的中间件(一个很好的select是https://www.npmjs.org/package/multer )。