一尘不染

Node.js正确使用bodyParser中间件

node.js

我是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,并且仅在选定的路由上使用文件上传处理功能,而无需重复很多代码?


阅读 543

收藏
2020-07-07

共1个答案

一尘不染

您的第二种方法很好。记住,你也可以通过中间件功能阵列app.postapp.get和朋友。因此,您可以uploadMiddleware使用处理POST正文,上载等内容的东西定义一个名为的数组,并使用该数组。

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

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

另外,这里是一个博客文章,其中包含有关bodyParser安全性注意事项的更多详细信息。

2020-07-07