Nodejs解析post的正确方式?
发布于 2 年前 作者 electrmc 4250 次浏览 来自 问答

在Nodejs开发指南中关于如何解析POST请求,有如下描述(下面是截图):

屏幕快照_2017-07-13_下午10_04_08.png

在最后(红框内)写道,在真实的生产环境中不要用如上代码,会严重效率和安全问题。

问题1:效率问题是什么? 是蓝框内代码位置不对,还是不应该用蓝框中的代码去接受post请求的请求体? 问题2:安全问题又是什么?

通常用的解析工具是koa-bodyparser,会把post请求体放到body中。但是Nodejs开发指南中说到:

  • 等待请求体传输可能是一件耗时的工作, 如上传文件。而很多时候我们可能并不需要理会请求体的内容,恶意的 POST请求会大大消耗服务器的资源。所以 Node.js默认是不会解析请求体的,当你需要的时候需要手动来做。*

那么用了koa-bodyparser后是不是所有的post请求都会接受?那nodejs得部分优势岂不是没了?

问题3:koa-bodyparser是会把post请求体都接收到吗?

问题4:最后,Nodejs是如何做到用的时候才去接受post请求体? 我猜测有两种方案: 方案一,client先将post请求头给nodejs,Nodejs根据请求头判断是否需要请求体,然后通知client发送请求体。 方案二,client一次性的把所有的请求都发送给Nodejs。Nodejs会把收到的数据暂存在一个地方,然后请求头判断是否从攒出处把请求体拿出来。 以上两种方案的区别是,方案一既能节省服务器流量又能节省服务器计算量。方案二只能节省服务器计算量不能节省流量。 各位,对上面的问题有什么看法,本人初入Nodejs期待讨论。

2 回复

问题1:效率问题是什么? 是蓝框内代码位置不对,还是不应该用蓝框中的代码去接受post请求的请求体? 问题2:安全问题又是什么? 蓝框内的代码现在已经被弃用,+=会有一个隐式的toString,对于某些unicode可能会有问题,官方推荐这个

	var body = [];
	req.setEncoding('utf8');
	req.on('data', function(chunk){
   	body.push(chunk);
	});
	req.on('end', function(){
	});

问题3:koa-bodyparser是会把post请求体都接收到吗? 不是 bodyparser可以解析普通的表单(application/x-www-form-urlencoded),没办法解析文件(Content-Type:multipart/form-data)

问题4:最后,Nodejs是如何做到用的时候才去接受post请求体? 没怎么看懂 bodyparser+formidable基本就能解决post场景

谢谢一楼。关于效率问题,我看到有人对formidable的源码解释为:formidable是边接收边处理,而不是等整个post体接收完成后再处理。边接收边处理可以在两个数据块达到的间隔内做处理。尤其是对于大文件的接收,这种方式可以提高效率。

回到顶部