在使用 Axios.js 进行网络请求时,若需区分网络超时和SSL证书无效错误,可通过以下方法实现:
1. 基于错误返回时间的差异- SSL证书无效错误:通常在请求发起后立即返回,因为浏览器或Node.js环境会在握手阶段验证证书有效性,一旦发现证书问题会直接终止连接。
- 网络超时错误:需要等待超时时间(如配置的timeout值)耗尽后才会返回错误,因此响应时间明显长于SSL错误。
示例逻辑:
axios.get('https://example.com'
, { timeout: 5000 }) .catch(error => { if (error.code === 'ERR_NETWORK') { const isImmediateError = error.config?.timeout ? (Date.now() - error.config.requestStartTime) < error.config.timeout : false; if (isImmediateError) { console.log('可能是SSL证书无效(立即返回)'); } else { console.log('可能是网络超时(延迟返回)'); } } });2. 通过errno属性区分Axios错误对象可能包含errno属性(依赖运行环境),其值可明确标识错误类型:
- 网络超时:errno = -110(异步错误)。
- SSL证书无效:
同步错误:errno = -218。
异步错误:errno = -308。
示例代码:
axios.get('https://example.com'
) .catch(error => { if (error.code === 'ERR_NETWORK' && error.errno) { switch (error.errno) { case -110: console.log('网络超时错误'); break; case -218: case -308: console.log('SSL证书无效错误'); break; default: console.log('其他网络错误'); } } });3. 结合错误消息内容(辅助判断)部分环境下,错误消息(error.message)可能包含关键信息:
- SSL证书无效:消息中可能包含certificate、SSL、SELF_SIGNED_CERT等关键词。
- 网络超时:消息中可能包含timeout、ETIMEDOUT等关键词。
示例:
axios.get('https://example.com'
) .catch(error => { if (error.code === 'ERR_NETWORK') { if (error.message.includes('certificate') || error.message.includes('SSL')) { console.log('SSL证书无效'); } else if (error.message.includes('timeout')) { console.log('网络超时'); } } });4. 完整区分方案综合上述方法,推荐以下处理流程:
axios.get('https://example.com'
, { timeout: 5000, requestStartTime: Date.now() // 自定义属性记录请求时间}).catch(error => { if (error.code === 'ERR_NETWORK') { // 方法1:检查errno if (error.errno === -110) { console.log('网络超时'); return; } if (error.errno === -218 || error.errno === -308) { console.log('SSL证书无效'); return; } // 方法2:检查返回时间(需配置requestStartTime) const isImmediate = error.config?.requestStartTime && (Date.now() - error.config.requestStartTime) < 1000; // 1秒内视为立即 if (isImmediate) { console.log('可能是SSL证书无效'); } else { console.log('可能是网络超时'); } // 方法3:检查错误消息(备用) if (error.message.includes('certificate')) { console.log('SSL证书无效(通过消息确认)'); } }});注意事项- 环境依赖:errno属性并非Axios标准字段,可能因Node.js版本或浏览器环境而异,建议先检测是否存在该属性。
- 超时配置:确保请求中设置了合理的timeout值,否则超时错误可能无法触发。
- 错误处理优先级:优先使用errno(最准确),其次结合返回时间和消息内容。
通过以上方法,可有效区分Axios.js中的网络超时与SSL证书无效错误。