我是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条答案
按热度按时间j2cgzkjk1#
你的第二种方法很好。请记住,您还可以将中间件函数数组传递给
app.post
、app.get
和朋友。所以你可以用你的东西定义一个名为uploadMiddleware
的数组来处理POST主体,上传等,并使用它。这些例子是为初学者准备的。帮助你在第一天就开始工作的初学者代码和高效安全的生产代码通常是非常不同的。你提出了一个关于不接受上传到任意路径的正确观点。至于解析所有请求体是“非常低效的”,这取决于发送到应用程序的无效/攻击POST请求与合法请求的比率。攻击探测请求的平均背景辐射可能不足以让你担心,直到你的网站开始流行起来。
Also here's a blog post with further details of the security considerations of bodyParser.