自定义Server Middleware调用外部API报证书过期返回空数据问题
问题原因
这个报错和你的自定义Server Middleware业务逻辑无关——返回普通字符串的接口不涉及外部HTTPS请求,所以能正常运行。certificate has expired是TLS握手阶段的证书校验失败错误,本质是Node.js环境在请求外部HTTPS接口时,校验证书链发现存在过期证书,常见诱因有三个:
- 本地Node版本过旧,内置的根证书库长期未更新,误判正常有效证书为过期
- 本地开启了抓包工具、连接了公司内网透明代理,代理本身的根证书过期,导致所有经过代理的HTTPS请求证书校验失败
- 目标接口服务端的证书链确实过期(公开服务出现该问题的概率极低)
解决步骤
- 基础环境排查
直接在本地终端执行curl https://www.boredapi.com/api/activity,如果curl同样报证书错误,优先处理环境问题:- 关闭本地抓包工具、退出系统全局代理后重试
- 将本地Node.js升级到18/20的长期支持(LTS)版本,同步更新内置根证书库
额外注意:你贴的同步版本中间件代码末尾多了个多余的
});,属于语法错误,运行时会直接抛异常,记得删掉多余符号。
- 本地调试临时方案(绝对禁止用于生产环境)
如果只是本地开发调试不想折腾证书配置,可以给axios请求加参数跳过TLS证书校验,同时修正代码里直接返回整个axios响应对象、报错时无返回值导致接口返回空对象的问题,参考代码如下:
const https = require('https'); async function testFunction() { try { const res = await axios({ method: "get", url: 'https://www.boredapi.com/api/activity', // 以下配置仅本地调试时开启,生产环境必须移除 httpsAgent: new https.Agent({ rejectUnauthorized: false }) }); // 仅返回接口响应体即可,不需要返回整个axios实例的冗余属性 return res.data; } catch (e) { console.warn('外部接口请求失败:', e); return { error: e.message }; } }
- 生产环境适配
生产环境绝对不能关闭证书校验,如果是内网部署场景,将内网代理/网关的根证书添加到Node运行环境的信任证书列表即可正常请求。
内容的提问来源于stack exchange,提问作者Craws
相关产品推荐
相关产品推荐

