Node.jsexpression正确使用bodyParser中间件

我是node.js的新手,expression了一段时间的尝试。 现在我对与parsing请求体相关的expression框架的devise感到困惑。 从快递的官方指南:

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

这种方法的问题是,在检查路由有效性之前,所有的请求主体将被首先parsing。 分析无效请求的机构似乎效率很低。 甚至更多,如果我们启用上传处理:

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

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

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

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

甚至可能在处理路由的每个函数中parsing主体。 但是,这是很乏味的事情。

有没有更好的方法使用express.bodyParser只有在所有有效的(定义的)路由,并使用file upload处理能力只在选定的路由,没有很多的代码重复?

你的第二种方法是好的。 请记住,您还可以将中间件函数的数组传递给app.postapp.get和friends。 所以你可以定义一个名为uploadMiddleware的数组来处理POST正文,上传等等。

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

这些例子适合初学者。 初学者代码,以帮助你在第一天工作,生产代码是高效和安全的往往是非常不同的。 关于不接受上传到任意path你肯定是有效的。 至于parsing所有的“非常低效的请求体”,这取决于无效/攻击POST请求与发送到你的应用程序的合法请求的比率。 攻击探测请求的平均背景辐射可能不足以担心,直到您的网站开始stream行。

这里还有一个博客文章,详细介绍bodyParser的安全考虑事项。