Node.js调用API报Parse Error: Expected HTTP/错误 问题咨询
问题根因
这个报错本质是HTTP客户端收到了非HTTP协议的响应内容,从错误里的rawPacket字段可以直接定位问题:
把buffer开头的字节转成字符串就是-ERR wrong number of arguments for 'get' command,这是Redis服务端原生RESP协议返回的标准错误格式,完全不符合HTTP响应格式规范。
你用的axios发起HTTP请求时,默认会等待接收以HTTP/开头的HTTP响应状态行,结果拿到了Redis返回的协议内容,解析失败就抛出了HPE_INVALID_CONSTANT、Expected HTTP/的错误。
你提到Redis服务端、redis-cli都能正常运行,日志里也打印了DB CONNECTED,说明数据库、Redis本身运行没有问题,核心问题是你把HTTP请求发错端口了,请求直接打到了Redis服务上,而不是你的Node.js后端接口。从报错配置能看到你请求的地址是http://localhost:2000/api/relevant-jobs,说明2000端口当前跑的不是Node.js HTTP服务,大概率是Redis服务,要么就是端口转发规则把请求导去了Redis端口。
Redis收到你发过去的HTTP报文后,会把报文内容当成Redis命令解析,读到GET关键字时发现参数格式不符合Redis命令要求,就直接返回了参数错误的RESP响应,刚好被axios接收到触发解析报错。
修复步骤
- 先核对端口配置:分别确认Node.js后端服务监听端口、Redis服务监听端口(Redis默认端口是6379),绝对不能让两个服务监听同一个端口,不要手滑把后端HTTP服务的监听端口写成Redis的端口,也不要把Redis客户端的连接端口写成你后端HTTP服务的端口。
- 验证端口对应服务:本地执行
curl http://localhost:2000/api/relevant-jobs,如果返回内容是-ERR开头的Redis错误提示,就实锤2000端口当前被Redis占用了,把两个服务的端口调整成不冲突的配置,重启服务即可。 - 检查代码配置:排查代码里服务启动、Redis初始化的逻辑,不要把
app.listen()的端口参数和Redis客户端初始化的port参数写串,比如不要出现app.listen(6379)这种把HTTP服务启动在Redis默认端口的低级错误。
内容的提问来源于stack exchange,提问作者Jaskaran Yadav
相关产品推荐
相关产品推荐

