Node.js用axios发HTTP请求报socket hang up,Postman正常如何解决
问题原因与解决方案
1 先修正代码中的明显错误
你提供的代码存在2处和axios用法不符的问题,是直接触发报错的可能原因:
- axios会自动序列化JS对象为JSON格式,也会自动添加
Content-Type: application/json请求头,手动执行JSON.stringify(body)会导致data被二次序列化,服务端解析失败直接断开连接 res.data.json()是fetch API的用法,axios已经默认将响应体解析为JS对象,不需要额外调用json()方法,调用不存在的方法会触发未捕获异常,也可能导致连接未正常关闭触发socket hang up
修正后的参考代码:
const getToken = async (username, password) => { try { const body = {username, password} const options = { method: 'POST', url: API_URI.auth, data: body } const response = await axios(options) console.log(response.data) return response.data } catch (error) { // 打印完整错误栈方便排查 console.log(error.message, error.stack) return false } }
2 排查代理配置差异
Postman和代码运行环境的代理配置不一致是该类问题最常见的诱因:
- 检查是否给axios设置了全局代理
axios.defaults.proxy,可以显式将该配置设为false禁用代理重试 - 检查代码运行的系统/容器环境是否设置了全局HTTP_PROXY、HTTPS_PROXY环境变量,和Postman的代理设置对比,确保一致
3 调整DNS解析配置(Node.js环境专属)
Node.js v17及以上版本默认开启IPv6优先的DNS解析策略,大部分服务端未适配IPv6路由会导致连接超时断开:
- 启动代码时添加运行参数:
node --dns-result-order=ipv4first 你的入口文件.js - 或者在代码入口最顶部添加配置:
const dns = require('dns') dns.setDefaultResultOrder('ipv4first')
4 排查版本兼容性问题
- 如果近期升级过axios版本,退回至v0.27.2、v1.3.5等稳定版本重试,部分小版本存在连接池bug会导致连接异常断开
- 如果近期升级过Node.js版本,退回至v16.x的LTS版本重试
5 调整HTTP连接配置
可以显式禁用axios的连接复用,避免连接池中过期的空闲连接被复用导致报错:
const https = require('https') const options = { // 其余配置保持不变 httpsAgent: new https.Agent({ keepAlive: false }) }
6 全量对比请求配置
开启axios的拦截器打印完整的请求头、请求体,和Postman中正常请求的配置逐字段对比,部分服务端会校验User-Agent、Accept、Origin等请求头字段,不符合要求的请求会被服务端直接断开连接。
内容的提问来源于stack exchange,提问作者Jesus Sagastume
相关产品推荐
相关产品推荐

