我无法在中间件中读取任何req.params。我有一个看起来像
的最小快递网络服务器'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
答案 0 :(得分:5)
我认为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);
});
答案 1 :(得分:1)
修改强>
我的回答不正确。您实际上并不需要json
或urlencoded
中间件来获取路由参数 - 只有req.query
和req.body
才能使用它们。如您所知(因为您是其中一个海报),您在评论中提供的链接会说明问题:
https://github.com/strongloop/express/issues/2088
问题在于您尝试在路由参数存在之前访问它们 - 中间件在路由之前运行。一种解决方案是使用该链接中建议的app.param()
(而不是您的userMiddleware
):
app.param('name', function(req, res, next, name) {
console.log('user came in. Hello ' + name);
next();
});
请注意,这会在所有路由中找到name
个参数,因此您可能希望将参数命名为更具体的参数,例如username
。如果你想以这种方式缩小范围,你也可以检查req.url
的开头。
BTW通常应避免使用原始代码中的req.param()
;引用Express文档:Direct access to req.body, req.params, and req.query should be favoured for clarity - unless you truly accept input from each object.
OLD ANSWER
将它留在这里,因为它包含可能在其他情况下有用的信息......
我认为你需要添加这个中间件才能获得GET和POST变量:
.use(express.json()) //support JSON-encoded bodies
.use(express.urlencoded()) //support URL-encoded bodies
和
.use(express.methodOverride())
如果您还需要在所有浏览器中使用HTTP动词,例如PUT或DELETE。
您可以只使用json
而不是urlencoded
和bodyparser
,但由于文件上传,这将是一个安全漏洞。见http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html。另外,在Express 4中不推荐bodyparser
。请注意,如果您想支持文件上传,则需要使用其他中间件(一个好的选项是https://www.npmjs.org/package/multer)。
答案 2 :(得分:0)
我遇到的最好的解决方案是使用具有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
})