NodeJS运行async await函数报UnhandledPromiseRejectionWarning: EPROTO错误
问题诱因
- 目标服务端gist.githubusercontent.com近期更新了SSL配置,禁用了旧版本TLS协议(如TLS 1.0、TLS 1.1),你当前运行环境默认发起请求用的TLS版本低于服务端要求的最低版本,导致SSL握手失败
- 本地网络环境发生变更,如新增了企业/校园SSL代理、运营商网络劫持,篡改了SSL握手过程的数据包,导致版本校验不通过
- 本地系统自动更新了openssl相关依赖组件,和当前使用的Node.js版本内置的openssl适配异常,导致SSL协议解析报错
解决方法
- 强制指定请求使用高版本TLS协议,修改代码如下:
const https = require('https'); const axios = require('axios'); // 新建HTTPS Agent,指定最低支持TLS 1.2版本 const httpsAgent = new https.Agent({ minVersion: 'TLSv1.2' // 临时排查可加 rejectUnauthorized: false,仅测试用,生产环境禁止开启 }) async function getStocks(){ const { data } = await axios.get('https://gist.githubusercontent.com/graffixnyc/8c363d85e61863ac044097c0d199dbcc/raw/7d79752a9342ac97e4953bce23db0388a39642bf/stocks.json', { httpsAgent: httpsAgent }) return data } async function abc(){ let a = await getStocks() console.log(a) } abc()
- 升级Node.js版本到16.x及以上的LTS版本,旧版本Node.js默认TLS支持版本较低,新版本默认适配TLS 1.2/1.3协议,无需额外配置即可兼容绝大多数站点的SSL要求
- 排查网络环境:切换为手机热点等其他网络重试请求,如果切换后请求正常,说明当前网络存在代理或劫持,可联系网络管理员确认SSL相关配置规则
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

