Node.js正确使用bodyParser中间件

时间:2012-09-14 04:58:10

标签: node.js express connect

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

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 个答案:

答案 0 :(得分:31)

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

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

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

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