Node.js 表达了对 bodyParser 中间件的正确使用

Posted

技术标签:

【中文标题】Node.js 表达了对 bodyParser 中间件的正确使用【英文标题】:Node.js express correct use of bodyParser middleware 【发布时间】:2012-09-07 06:08:25 【问题描述】:

我是 node.js 和 express 的新手,并且已经尝试了一段时间。现在我对与解析请求正文相关的 express 框架的设计感到困惑。 来自express官方指南:

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

设置好所有中间件后,我们添加我们要处理的路由:

app.post('/test', function(req, res) 
  //do something with req.body      
);

这种方法的问题是在检查路由有效性之前会先解析所有请求正文。解析无效请求的主体似乎非常低效。更重要的是,如果我们启用上传处理:

app.use(express.bodyParser(uploadDir: '/temp_dir'));

任何客户端都可以通过上传任何文件来轰炸服务器(通过向任何路由/路径发送请求!!),所有这些都将被处理并保存在“/temp_dir”中。我不敢相信这种默认方法正在被广泛推广!

我们当然可以在定义路由的时候使用bodyParser函数:

app.post('/test1', bodyParser, routeHandler1);
app.post('/test2', bodyParser, routeHandler2);

甚至可能在处理路由的每个函数中解析主体。但是,这样做很乏味。

有没有更好的方法让 express.bodyParser 只用于所有有效(已定义)的路由,并且只在选定的路由上使用文件上传处理功能,而无需大量重复代码?

【问题讨论】:

【参考方案1】:

您的第二种方法很好。请记住,您还可以将中间件函数数组传递给app.postapp.get 和朋友。因此,您可以使用处理 POST 正文、上传等的东西定义一个名为 uploadMiddleware 的数组,并使用它。

app.post('/test1', uploadMiddleware, routeHandler1);

这些示例适用于初学者。帮助您在第一天就开始工作的初学者代码和高效且安全的生产代码通常是非常不同的。关于不接受上传到任意路径,您提出了一个肯定有效的观点。至于解析所有“非常低效”的请求主体,这取决于无效/攻击 POST 请求与发送到您的应用程序的合法请求的比率。在您的网站开始流行之前,可能不足以担心攻击探测请求的平均背景辐射。

Also here's a blog post with further details of the security considerations of bodyParser.

【讨论】:

哇,赞成重新审视您一年前的答案以包括最近的发展:bodyParser “帮助您在第一天就开始工作的初学者代码和高效且安全的生产代码通常有很大不同。”阿门。

以上是关于Node.js 表达了对 bodyParser 中间件的正确使用的主要内容,如果未能解决你的问题,请参考以下文章

Node.js bodyparser实现原理解析

使用 Node.js 发送 POST JSON 数据并接收(无 BODYPARSER)

错误:大多数中间件(如 bodyParser)不再与 Express 捆绑

node.js 常用模块(初级)

Google的App引擎添加了对Node.js的支持

使用 Node.js 和 Express 发布时如何访问请求正文?