[eggjs/egg]curl请求后端接口报错ResponseError: Parse Error

2025-11-14 44 views
8

curl请求后端接口报错ResponseError: Parse Error。没有超时,因为是立即返回的,直接报错了。还有不是每个接口都会报错,只有一两个接口会报错。部署到linux服务器上报错,本地不报错。而且在linux服务器上直接用curl命令发起请求看到服务端是正常返回的。 报错信息如下:

ResponseError: Parse Error, POST http://10.100.23.11:8001/front/service/v1/resource/save -1 (connected: true, keepalive socket: false, agent status: {"createSocketCount":20,"createSocketErrorCount":0,"closeSocketCount":19,"errorSocketCount":0,"timeoutSocketCount":18,"requestCount":29,"freeSockets":{},"sockets":{"10.100.23.11:8001:":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)
Context
  • Node Version:8.16
  • Egg Version:2.2.1
  • Platform:linux服务器

咨询下这种情况是什么原因引起的?

回答

3

如果可以稳定复现的话,就抓包看看吧

2

抓包情况如下 没有收到response,请问是否和node版本有关?

0

没有 response 的话,都还没到 Node 这层。。。应该看看为啥你的服务端接口没有返回 response

4

但是用curl命令的话是可以的。。node发起请求的话服务端看日志也是返回了,就是node这层没有收到。。

1

但是用curl命令的话是可以的。。node发起请求的话服务端看日志也是返回了,就是node这层没有收到。。

可以分享一下 node 发起请求的代码是怎么写的吗?

9

node发起请求的话服务端看日志也是返回了

但网络层你抓包都没返回啊。

4

应该是查到原因了 node版本太高了。。导致解析响应错误了。感谢大大们

6

应该是查到原因了 node版本太高了。。导致解析响应错误了。感谢大大们

我对这个结论持怀疑态度,除非你上面的抓包是错的。

提供下解析响应错误的 response 和 header 看看,Node 没理由有这样的 bug 的。

cc @hyj1991

6

我本地装了最新node版本12.9。报错信息如下

ResponseError: Parse Error: Invalid header value char, POST http://10.100.23.11:8020/front/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)

可以看出解析头部header报错了。。 我本地换成node10.16.3后,获取到的response是

{ 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': 'front:dev:8020',
  trace_id: '682033d4866c4438b26978cce00c4520',
  code: '0x08f70038' }
6

Invalid header value char

感觉是服务端返回了非法字符,然后 Node 新版本校验更严格了。

可以把 header 抓下 POST 上来,看看大家能否复现下。(你总不会以后永远不升级 Node 版本吧?)

cc @hyj1991 关注下。

2

notation: '@\tѧ¹òsTvÖDÖsTsû\u000eͰ dѧ¹',

是不是这一串的问题,这是啥。。。

8

应该是这个原因引起的,我看下下其他有问题的接口也是这个地方乱码了。。

3

后端那边检查下为啥这样吧。

1

就是这个引起的,正常的时候这个是英文,乱码的时候就会报错,后端那里塞中文的时候有问题

2

有最小复现的仓库么,这个得本地 debug 下看看为啥解析会报错。

6

@hyj1991

this.ctx.set('test', '@\tѧ¹òsTvÖDÖsTsû\u000eͰ dѧ¹');

7

需要 encode 下,header 有规范

9

Node.js 12 换了 http parser,应该是这个更严格了。