Node.js 无法在express中间件中获取请求参数
我无法读取中间件中的任何req.params。我有一个最小的express web服务器,看起来像Node.js 无法在express中间件中获取请求参数,node.js,express,Node.js,Express,我无法读取中间件中的任何req.params。我有一个最小的express 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(); } //
'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...");
当我尝试点击localhost:3000/user/williams时,我希望在日志中看到:
user came in. Hello williams
但我明白了
user came in. Hello undefined
我是否应该包括任何其他中间件,以便在中间件中填充req.params?
我正在使用express@3.3.4
编辑
我下面的回答不正确。您实际上不需要json
或urlencoded
中间件来获取路由参数-它们只需要req.query
和req.body
才能工作。正如你所知(因为你是那里的海报之一),你在评论中提供的链接描述了这个问题:
问题是您试图在路由参数存在之前访问它们——中间件在路由存在之前运行。一种解决方案是使用该链接中建议的app.param()
(而不是您的userMiddleware
):
请注意,这将在所有路由中找到name
参数,因此您可能希望将参数命名为更具体的名称,如username
。如果您想这样缩小范围,还可以检查req.url
的开头
顺便说一句,通常应该避免像在原始代码中那样使用req.param()
;引用Express docs:为清晰起见,应倾向于直接访问req.body、req.params和req.query,除非您真正接受每个对象的输入。
旧答案 将其留在此处,因为它包含在其他情况下可能有用的信息 我认为您需要添加此中间件,以便使GET和POST变量可用:
.use(express.json()) //support JSON-encoded bodies
.use(express.urlencoded()) //support URL-encoded bodies
以及:
如果您还需要在所有浏览器中使用HTTP动词,如PUT或DELETE
您可以只使用bodyparser
,而不是json
和urlencoded
,但由于文件上载,这将是一个安全漏洞。看见此外,Express4中不推荐使用bodyparser
。请注意,如果您想支持文件上传,您需要使用额外的中间件(一个好的选择是)。我认为app.param()
在这种情况下是非常规的,并且不是真正直观的。因为我已经有了表示中间件的函数,我可以做:
//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);
});
我遇到的最好的解决方案是使用带有
all
方法的路由器
例如:
function middleware(req, res, next) {
console.log('Parameters - ', req.params)
}
let router = require('express').Router
router.route('/test')
.all(middleware)
.get((req, res, next) => {
// handle route
})
我试着用那些中间工具。但它们对填充req.params对象没有任何作用。我更新了我的答案,您提供了比GitHub更多的解决方案描述,以防对您或未来的访问者有所帮助。相关问题:
//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);
});
function middleware(req, res, next) {
console.log('Parameters - ', req.params)
}
let router = require('express').Router
router.route('/test')
.all(middleware)
.get((req, res, next) => {
// handle route
})