首页 > 编程语言 >nodejs的http.request最大响应体

nodejs的http.request最大响应体

时间:2023-12-12 17:48:23浏览次数:36  
标签:http nodejs Buffer chunk request data response

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

相关文章

  • requests模块基本使用
    1.requests模块基本使用1.1使用requests发送get请求importrequests#res响应对象,http响应,python包装成了对象,响应头,响应头。。。在res中都会有res=requests.get('https://www.cnblogs.com/Hao12345/p/17661461.html')print(res.text)#res.text------->响应体......
  • html中的base标签,<base href="http://xxx.com/">什么意思
    HTML中的<base>标签用于指定页面上所有相对URL的基础路径。该标签位于<head>标签内,并具有一个href属性,用于指定基础路径URL。例如:<head><basehref="http://example.com/"/></head>一旦设置了<base>标签,页面上所有使用相对路径的链接、图像、脚本等资源都将以指定的基准U......
  • httprunner 安装
    接口自动化httprunner4.x安装  python最好安装3.8及以下安装pip3installhttprunner 卸载 pip3uninstallhttprunner安装后查看是否安装成功提示:'hrp'不是内部或外部命令 由于安装的是httprunner4.x的版本,不能直接使用hrp命令行工具,需要手动配置,下载编译产物,......
  • 浏览器中导出导入证书,https网站报非安全链接
    1、查看证书信息2、点击“网站非安全链接”3、点击“证书信息”,然后导出。4、保存证书至文件夹5、打卡Internet选项,找到内容-证书6、找到“受信任的根证书颁发机构”点击导入。7、找到导出的证书文件,导入即可。......
  • NodeJs学习笔记
    目录NodeJsBuffer(缓冲区)概念特点使用计算机基础进程与线程fs模块写入文件①.writeFile异步写入②.writeFileSync同步写入③.appendFile/appendFileSync追加写入④.createWriteStream流式写入需要写入文件的场景文件读取①.readFile异步读取②.readFileSync同步读......
  • Python网络连接request报错:OSError: [Errno 113] No route to host
    报错:(pytorch)devil@Monster:~$huggingface-clilogin_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|......
  • Istio从入门到精通—— 流量治理的原理 —— VirutalService —— HTTPMatchRequest
    流量治理的原理——VirutalService——HTTPMatchRequestHttpMatchRequestspecifiesasetofcriteriontobemetinorderfortheruletobeappliedtotheHTTPrequest.Forexample,thefollowingrestrictstheruletomatchonlyrequestswheretheURLpaths......
  • Spring mvc之RequestMappingInfo类
    请求映射信息。封装以下请求映射条件:PatternsRequestConditionRequestMethodsRequestConditionParamsRequestConditionHeadersRequestConditionConsumesRequestConditionProducesRequestConditionRequestCondition(optional,customrequestcondition)1.参数说明@Nullablep......
  • 使用HTTP协议在Linux上进行API调用
    在Linux系统上使用HTTP协议进行API调用是一种常见的操作,有时候我们需要调用一些外部API来获取数据或者进行自动化操作。下面是一个使用HTTP协议在Linux上进行API调用的代码示例,希望能够帮助你更好地理解这个过程。首先,我们需要使用curl命令行工具来发送HTTP请求。在终端中输入以下......
  • Linux上使用Python的requests库进行HTTP请求
    在Linux上使用Python的requests库进行HTTP请求是一种非常方便和高效的方式。requests库是一个第三方库,用于发送HTTP请求并获取响应。下面是一个简单的示例,演示如何使用requests库发送GET请求并获取响应。首先,你需要安装requests库。你可以使用pip命令来安装它:bash复制代码pipinsta......