相同请求下Java返回500错误但Node返回200如何排查
问题描述
开发对接API过程中编写了逻辑完全一致的Java、Node.js(JavaScript)两套实现代码,两套代码此前均能正常运行,近期突发异常:请求头、请求体完全相同的前提下,Java实现调用接口返回500状态码,Node.js实现仍正常返回200状态码。
Node.js侧调用详情(返回200,调用成功)
- 请求方式与地址:
POST http://localhost:3001/pay - 网络信息:
- address:
"::1" - family:
"IPv6" - port: 3001
- address:
- 请求头:
Content-Type: application/json User-Agent: PostmanRuntime/7.29.0 Accept: */* Cache-Control: no-cache Postman-Token: c3a4c3e4-8619-4d00-b1f0-5d32f0e65890 Host: localhost:3001 Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 71
- 响应头:
X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 693 ETag: W/"2b5-crRygc3ceDh/mgZoQAOuLBQoVsc" Date: Fri, 03 Jun 2022 08:42:47 GMT Connection: keep-alive Keep-Alive: timeout=5
Java侧调用详情(返回500,调用失败)
- 请求方式与地址:
POST http://localhost:8090/pay - 网络信息:
- address:
"::1" - family:
"IPv6" - port: 8090
- address:
- 请求头:
Content-Type: application/json User-Agent: PostmanRuntime/7.29.0 Accept: */* Cache-Control: no-cache Postman-Token: 88453221-ab41-4b51-843b-3022a5db571a Host: localhost:8090 Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 71
- 响应头:
Content-Type: application/json Transfer-Encoding: chunked Date: Fri, 03 Jun 2022 08:43:19 GMT Connection: close
- 响应体:
{"timestamp":"2022-06-03T08:43:19.971+00:00","status":500,"error":"Internal Server Error","path":"/pay"}
备注:两套实现的请求头、请求体完全一致。
排查结论与解决步骤
核心问题非常明确:两个请求根本没有发送到同一个后端服务,和请求头、请求体是否一致没有关系:
- Node.js请求的3001端口从响应头
X-Powered-By: Express判断,是Node.js Express技术栈的服务,本身运行正常所以返回200。 - Java请求的8090端口从响应体结构判断,是Spring Boot框架提供的服务,属于Java技术栈,返回的是框架默认的500错误响应。
按以下顺序排查即可解决:
- 先检查Java侧的请求配置,确认是否把目标端口写错了,将请求地址端口从8090改为和Node.js侧一致的3001后重试,绝大多数场景下这一步就能解决问题。
- 如果业务逻辑本来就要求Java侧调用8090端口的Spring Boot服务,不需要在客户端侧反复核对请求参数,直接去查8090端口对应服务的运行日志。500是服务端内部抛出未捕获异常导致的错误,日志中会留存完整的异常栈信息,根据异常栈定位代码问题即可。常见触发原因包括:近期服务上线新版本、依赖包升级、数据库/缓存/第三方中间件连接配置失效、接口逻辑修改未做兼容。
- 额外做端口占用校验:执行本地端口监听查询命令,确认3001、8090端口对应的运行进程是否符合预期,排除端口被其他无关服务意外占用的情况。
内容的提问来源于stack exchange,提问作者Concellia
相关产品推荐
相关产品推荐

