nodejs的http.request躺坑记录
1、http.request之response.on("data",(chunk:Buffer)=>{})的chunk大小
由于nodejs的response.on("data")
每次从服务端读取的chunk大小最大是65535Byte,并且查很多网站都找不大这个说明点所以狠狠踩了这个坑。这个65535有什么影响呢。本来编写的服务端通过post给客户端返回一个10MB大小的文件,数据以Buffer格式写入到响应体内。最后发现在本地127地址下居然需要6秒甚至更多的响应时间才能把文件传输到客户端。我寻思一个本地服务器tmd再怎么慢也不能那么慢,本地随随便便跑50MB/s肯定没问题。通过反反复复debug服务端的发送chunk大小和客户端chunk的大小都没发现问题,最后一看ondata的chunk结果每次最大不超过65535,10MB居然调用了605次ondata才接收完毕。每次耗时10ms左右,真的服了。关键是在这像垃圾桶一样的中文互联网下也找不到这个问题的说明。Stack Overflow也没找到相关情况。
解决办法:不使用on("data"),改成on("readable"),在回调内通过response.read()手动读取
原本的代码:
let data:Buffer = Buffer.from([])
response.on("data",(chunk:Buffer)=>{
// 拼接data,chunk最高水准为 65535 Byte
data = Buffer.concat([data, chunk])
})
response.on("end",()=>{
// 执行请求回调
console.log(data.length)
})
修改后的代码:
let data:Buffer = Buffer.from([])
response.on("readable",()=>{
let buff = null;
// 每次读取5MB大小
while((buff=response.read(5*1024*1024)) != null){
data = Buffer.concat([data, buff]);
}
})
response.on("end",()=>{
// 执行请求回调
console.log(data.length)
})
2、response.on("end",()=>{})的触发条件
一句话说明白:如果response不监听response.on("data")或者response.on("readable"),则response.on("data")不会被触发。
你说坑不坑,tnnd
标签:http,nodejs,Buffer,chunk,request,data,response From: https://www.cnblogs.com/MCMonkey/p/17897407.html