当前位置: 首页 > 后端技术 > Node.js

egg请求接口curl报错ResponseError-ParseError

时间:2023-04-03 15:42:57 Node.js

后台节点作为中间层调用后端java服务器接口。问题curl请求后端接口报错ResponseError:ParseError。没有超时,因为是立即返回,直接报错。不是每个接口都会报错,只有一两个接口会报错。部署到linux服务器报错,本地却不报错。而在linux服务器上,直接使用curl命令发起请求,看到服务器正常返回。报错信息如下:ResponseError:ParseError,POSThttp://10.16.70.183:9104/xres-rms/service/rs/v1/deviceService/save-1(connected:true,keepalivesocket:false,agentstatus:{“createSocketCount”:20,“createSocketErrorCount”:0,“closeSocketCount”:19,“errorSocketCount”:0,“timeoutSocketCount”:18,“requestCount”:29,“freeSockets”:{},“套接字”:{"10.16.70.183:9104:":1},"requests":{}},socketHandledRequests:1,socketHandledResponses:0)headers:{}atSocket.socketOnData(_http_client.js:452:22)atSocket.emit(events.js:200:13)ataddChunk(_stream_readable.js:294:12)atreadableAddChunk(_stream_readable.js:275:11)atSocket.Readable.push(_stream_readable.js:210:10)atTCP.onStreamRead(internal/stream_base_commons.js:166:17)检查故障排除步骤是否是服务器设置导致的。列表项使用命令curl向服务器发起请求,看是否正常。curl发起请求的命令如下curl-XPOST\http://10.19.132.127:9104/xres-rms/service/rs/v1/deviceService/save\-H'Content-Type:application/json'\-H'Postman-Token:4b9c514b-2444-4f3e-850c-2629987fcac4'\-H'TOKEN:SElLIDBPUENpUGNPZm5JNkVQbDQ6N3pHaTNmcWJxNnFIRWdEeTh5dTZ2ZmpWb1NMZi9uaUNFTWY2cE11ZHFTWT06MTU2NjYxNTQ4NDA5Ng=='\-H'cache-control:no-cache'\-d'{"resourceType":"ENCODE_DEVICE","externalIndexCode":"10000000001320939591","userPwd":"EQAQAODkw0AuqpGM21fuUtkYDOzQfnlKYi7FWLSSSOYtjwexwFAmeienXbEF4BkFWyaOjA==","treatyType":"hiksdk_net","netZoneId":0","tag"@:制造商Pavisioner":"$$","addType":1,"networkAddr":"1.1.6.1","networkPort":8001,"userName":"admin","belongIndexCode":"","deviceClass":"100001“,“analogChanCount”:0,“digitalChanCount”:0,“alarmInCount”:0,“alarmOutCount”:0,“regionIndexCode”:“ed87743033f3459f814edaf1cc0d4420”,“deviceCategory”:“vss”,“pwdStrength”:3}'可见不是服务器设置问题,应该是代码问题。既然不是代码问题,先抓包看数据分析。使用tcpdump抓包看到打开linux服务器的请求,输入如下命令:tcpdump-ieth0'((tcp)and(port9104)and(dsthost10.19.132.127))'-wout.cap抓包发送到10.19.132.127,端口都是9104的tcp请求,输出保存到out.cap文件eth0代表网卡,用命令ipa查询网卡,用wireshark打开请求的接口,查看详情,可以看到没有收到response,正常的response是这样的,frame中会有response。可以确认没有收到任何回复。但是em...为什么节点版本是12.4??最新的稳定版显然是10.16.3。.可以查看node官网,最新版本是12.9.1。为了验证我的猜测,我安装了最新版本的12.9.1,所以本地界面也报错ResponseError:ParseError:Invalidheadervaluechar,POSThttp://10.19.132.127:8020/xres-res/服务/rs/resourceOrgRestService/v1/batchDeleteResourceOrg-1(已连接:true,keepalivesocket:true,代理状态:{“createSocketCount”:6,“createSocketErrorCount”:0,“closeSocketCount”:5,“errorSocketCount”:0,“timeoutSocketCount":5,"requestCount":12,"freeSockets":{},"sockets":{"10.19.132.127:8020:":1},"requests":{}},socketHandledRequests:4,socketHandledResponses:3)headers:{}atSocket.socketOnData(_http_client.js:456:22)atSocket.emit(events.js:209:13)ataddChunk(_stream_readable.js:305:12)atreadableAddChunk(_stream_readable.js:286):11)atSocket.Readable.push(_stream_readable.js:220:10)atTCP.onStreamRead(internal/stream_base_commons.js:166:17)看这里错误很明显CauseResponseError:ParseError:Invalidheader值char响应头解析失败。检查断点处的响应头,将本地节点版本改回稳定版10.16.3。你看到的数据如下{notation:'@\t?§1òsTv?D?sTs?\u000eí°d?§1',span_id:'78f9edd00a134b5d8c4b4bc3c35dd1bf',date:'Mon,26Aug201906:07:51GMT',connection:'keep-alive','content-type':'application/json','content-length':'134','x-application-context':'xres-res:dev:8020',trace_id:'682033d4866c4438b26978cce00c4520',code:'0x08f70038'}可以看到写法是乱码,导致解析失败。结语Node12使用了新的http-parser,所以对responseheader要求比较严格,导致解析失败~使用最新版node需谨慎,目前还在踩坑阶段~~