Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法在express中间件中获取请求参数_Node.js_Express - Fatal编程技术网

Node.js 无法在express中间件中获取请求参数

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(); } //

我无法读取中间件中的任何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();
}

//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
   })