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

时间:2014-08-15 00:47:37

标签: node.js express

我无法在中间件中读取任何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

3 个答案:

答案 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)

修改

我的回答不正确。您实际上并不需要jsonurlencoded中间件来获取路由参数 - 只有req.queryreq.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而不是urlencodedbodyparser,但由于文件上传,这将是一个安全漏洞。见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
   })