快递中间件无法获取请求参数
我无法读取我的中间件中的任何请求。 我有一个最小的快速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); });
编辑
我下面的答案是不正确的。 你实际上不需要json
或urlencoded
中间件来获取路由参数 – 只有req.query
和req.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。
除了json
和urlencoded
,您可以使用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 )。