node做爲中間層調用後端java服務端接口。java
curl請求後端接口報錯ResponseError: Parse Error。沒有超時,由於是當即返回的,直接報錯了。不是每一個接口都會報錯,只有一兩個接口會報錯。部署到linux服務器上報錯,本地不報錯。並且在linux服務器上直接用curl命令發起請求看到服務端是正常返回的。
報錯信息以下:node
ResponseError: Parse Error, POST http://10.16.70.183:9104/xres-rms/service/rs/v1/deviceService/save -1 (connected: true, keepalive socket: false, agent status: {"createSocketCount":20,"createSocketErrorCount":0,"closeSocketCount":19,"errorSocketCount":0,"timeoutSocketCount":18,"requestCount":29,"freeSockets":{},"sockets":{"10.16.70.183:9104:":1},"requests":{}}, socketHandledRequests: 1, socketHandledResponses: 0) headers: {} at Socket.socketOnData (_http_client.js:452:22) at Socket.emit (events.js:200:13) at addChunk (_stream_readable.js:294:12) at readableAddChunk (_stream_readable.js:275:11) at Socket.Readable.push (_stream_readable.js:210:10) at TCP.onStreamRead (internal/stream_base_commons.js:166:17)
在服務器上用命令curl發起請求,看是否正常。curl發起請求的命令以下linux
curl -X POST \ 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, "manufacturer": "hikvision", "tag": "@@", "tagPath": "$$", "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 }'
能夠看出不是服務器的設置問題,應該是代碼問題。既然不是代碼問題,先抓包看看數據分析一下。git
打開linux服務器,輸入如下命令:json
tcpdump -i eth0 '((tcp) and (port 9104) and (dst host 10.19.132.127))' -w out.cap
抓取發送到10.19.132.127,端口是9104的全部tcp請求,並輸出並保存到out.cap文件 eth0表示網卡,查詢網卡用命令後端
ip a
能夠看出沒有收到response
看下正常的response是這樣的服務器
是會有個response in frame的。
能夠肯定確實沒有收到response。
可是em...爲何node版本是12.4??最新的穩定版本明明是10.16.3啊。。能夠看node官網查看最新版本是12.9.1,爲了驗證個人猜測,我安裝了最新的12.9.1的版本,因而本地接口也報錯了app
ResponseError: Parse Error: Invalid header value char, POST http://10.19.132.127:8020/xres-res/service/rs/resourceOrgRestService/v1/batchDeleteResourceOrg -1 (connected: true, keepalive socket: true, agent status: {"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: {} at Socket.socketOnData (_http_client.js:456:22) at Socket.emit (events.js:209:13) at addChunk (_stream_readable.js:305:12) at readableAddChunk (_stream_readable.js:286:11) at Socket.Readable.push (_stream_readable.js:220:10) at TCP.onStreamRead (internal/stream_base_commons.js:166:17)
這裏很是明顯的看到了錯誤緣由curl
ResponseError: Parse Error: Invalid header value char
響應頭解析失敗。打斷點查看響應頭,把本地的node版本改回穩定版本10.16.3,看到的數據以下socket
{ notation: '@\tѧ¹òsTvÖDÖsTsû\u000eÍ° dѧ¹', span_id: '78f9edd00a134b5d8c4b4bc3c35dd1bf', date: 'Mon, 26 Aug 2019 06:07:51 GMT', connection: 'keep-alive', 'content-type': 'application/json', 'content-length': '134', 'x-application-context': 'xres-res:dev:8020', trace_id: '682033d4866c4438b26978cce00c4520', code: '0x08f70038' }
能夠看到notation這裏亂碼了,致使瞭解析失敗。
node12用了新的http-parser,因此對響應頭的要求更嚴格了,致使瞭解析失敗~用最新版的node需謹慎,如今都仍是踩坑的階段~~