web请求 错误拦截

错误:1、有响应http错误 2、无响应的网络错误 防火墙等

没有 。当 error.code 存在(如 ECONNABORTED, ERR_NETWORK 等)时,通常 没有 error.response 对象

防火墙导致连接失败

1. ECONNABORTED / ETIMEDOUT - 请求超时

2. ECONNRESET - 连接被重置

复制代码
// 连接建立后被异常中断

// 1. 防火墙/安全组阻断
// 服务器防火墙主动断开连接
// 云服务商安全组规则限制

// 2. 代理服务器中断
// 代理服务器配置问题或故障

// 3. 服务器进程崩溃
// 后端服务突然停止

axios.get('/api/data')

.catch(error => {

// 情况1:服务器返回了HTTP错误状态码

if (error.response) {

// 这里 error.code 通常为 undefined

console.log('HTTP错误:', error.response.status);

console.log('错误代码:', error.code); // undefined

// 显示用户友好提示

const status = error.response.status;

if (status >= 500) {

showMessage('服务器暂时不可用,请稍后再试');

} else if (status === 404) {

showMessage('您查找的内容不存在');

} else if (status === 401 || status === 403) {

showMessage('请重新登录以继续操作');

} else {

showMessage('操作失败,请稍后重试');

}

}

// 情况2:网络层错误(没有收到服务器响应)

else if (error.request) {

// 这里 error.code 可能有值,error.response 为 undefined

console.log('网络错误,错误代码:', error.code);

console.log('服务器响应:', error.response); // undefined

// 根据错误代码显示提示

if (error.code) {

switch (error.code) {

case 'ECONNABORTED':

case 'ETIMEDOUT':

showMessage('请求超时,请检查网络连接');

break;

case 'ECONNRESET':

showMessage('网络连接中断,请重试');

break;

case 'ENOTFOUND':

case 'ERR_NAME_NOT_RESOLVED':

showMessage('无法连接到服务器,请稍后再试');

break;

case 'ERR_NETWORK':

showMessage('网络连接失败,请检查网络设置');

break;

default:

showMessage('网络异常,请检查后重试');

}

} else {

// 没有错误代码的通用网络错误

showMessage('网络连接异常,请检查后重试');

}

}

// 情况3:其他错误(如配置错误、取消请求等)

else {

console.log('其他错误:', error.message);

showMessage('操作失败,请重试');

}

});

ECONNABORTED / ETIMEDOUT 错误的全称以及明明规则

`ECONNABORTED` 和 `ETIMEDOUT` 错误详解

**一、错误全称与命名规则**

**1. `ECONNABORTED`**

  • **全称**: **Connection Aborted**(连接中止)

  • **命名规则**:

  • `E` - Error(错误前缀,Unix/Linux系统错误码标准)

  • `CONN` - Connection(连接)

  • `ABORTED` - 已中止

  • **来源**: POSIX/Unix 系统错误码

  • **错误号**: 通常对应系统错误码 **ECONNABORTED (103)**

**2. `ETIMEDOUT`**

  • **全称**: **Connection Timed Out**(连接超时)

  • **命名规则**:

  • `E` - Error

  • `TIMEDOUT` - 已超时(或写作 TIMEOUT)

  • **来源**: POSIX/Unix 系统错误码

  • **错误号**: 通常对应系统错误码 **ETIMEDOUT (110)**

**二、POSIX 错误码命名规则**

**通用格式:**

```

E + 描述性名称(全大写,下划线分隔)

```

**常见前缀含义:**

```c

// Linux/Unix 系统错误码示例

EACCES // E + ACCESS(权限不足)

EADDRINUSE // E + ADDRESS IN USE(地址已被使用)

EAGAIN // E + AGAIN(资源暂时不可用)

EBADF // E + BAD FILE DESCRIPTOR(错误的文件描述符)

ECONNREFUSED// E + CONNECTION REFUSED(连接被拒绝)

EEXIST // E + EXIST(文件已存在)

EFAULT // E + FAULT(错误地址)

EINTR // E + INTERRUPTED(系统调用被中断)

EINVAL // E + INVALID ARGUMENT(无效参数)

EIO // E + INPUT/OUTPUT(I/O错误)

EISDIR // E + IS DIRECTORY(是目录而非文件)

ELOOP // E + LOOP(符号链接循环)

ENOENT // E + NO ENTRY(文件或目录不存在)

ENOMEM // E + NO MEMORY(内存不足)

ENOSPC // E + NO SPACE(设备无空间)

ENOTDIR // E + NOT DIRECTORY(不是目录)

ENOTEMPTY // E + NOT EMPTY(目录非空)

EPERM // E + PERMISSION(操作不允许)

EPIPE // E + PIPE(管道破裂)

EROFS // E + READ-ONLY FILE SYSTEM(只读文件系统)

ESPIPE // E + SEEK ON PIPE(在管道上定位)

ESRCH // E + SEARCH(进程不存在)

```

**三、Node.js 中的错误码体系**

Node.js 继承了 POSIX 错误码,并扩展了一些:

**网络相关错误码:**

```javascript

// 连接相关

'ECONNABORTED' // Connection aborted (连接中止)

'ECONNREFUSED' // Connection refused (连接被拒绝)

'ECONNRESET' // Connection reset by peer (对端重置连接)

// 超时相关

'ETIMEDOUT' // Connection timed out (连接超时)

'EAI_AGAIN' // Temporary failure (临时故障)

// 地址相关

'EADDRINUSE' // Address already in use (地址已被使用)

'EADDRNOTAVAIL' // Address not available (地址不可用)

'EAFNOSUPPORT' // Address family not supported (地址族不支持)

// DNS相关

'ENOTFOUND' // Host not found (主机未找到)

'EAI_FAIL' // Non-recoverable failure (不可恢复的故障)

```

**Node.js 特有的错误码:**

```javascript

// HTTP/HTTPS 相关

'ERR_HTTP_HEADERS_SENT' // Headers already sent

'ERR_HTTP_INVALID_STATUS_CODE' // Invalid status code

// TLS/SSL 相关

'ERR_TLS_CERT_ALTNAME_INVALID' // Certificate alt name invalid

'ERR_TLS_DH_PARAM_SIZE' // DH param size too small

// 流相关

'ERR_STREAM_WRITE_AFTER_END' // Write after end

'ERR_STREAM_DESTROYED' // Stream destroyed

// 其他

'ERR_SOCKET_BAD_PORT' // Bad port number

'ERR_INVALID_ARG_TYPE' // Invalid argument type

```

**四、浏览器环境与 Axios 错误码**

浏览器环境下的错误命名有所不同:

**浏览器网络错误:**

```javascript

// Chrome/Edge 的错误消息(不是错误码)

'net::ERR_CONNECTION_RESET' // 连接被重置

'net::ERR_CONNECTION_TIMED_OUT' // 连接超时

'net::ERR_CONNECTION_REFUSED' // 连接被拒绝

'net::ERR_NAME_NOT_RESOLVED' // DNS解析失败

'net::ERR_EMPTY_RESPONSE' // 空响应

'net::ERR_CERT_COMMON_NAME_INVALID' // 证书名称无效

// Firefox 的错误消息

'NS_ERROR_CONNECTION_REFUSED' // 连接被拒绝

'NS_ERROR_NET_TIMEOUT' // 网络超时

```

**Axios 错误码映射:**

```javascript

// Axios 将浏览器错误转换为标准错误码

axios.get('/api')

.catch(error => {

// 浏览器错误消息 → Axios 错误码

if (error.message.includes('ERR_CONNECTION_TIMED_OUT')) {

// 对应 ETIMEDOUT

}

if (error.message.includes('ERR_CONNECTION_RESET')) {

// 对应 ECONNRESET

}

});

```

**五、错误码的来源层级**

```

应用层 (Axios/浏览器)

传输层 (Node.js/操作系统)

系统层 (POSIX/Linux Kernel)

```

**示例流程:**

```javascript

// 1. 浏览器请求超时

// 浏览器控制台显示: net::ERR_CONNECTION_TIMED_OUT

// 2. Axios 捕获并转换

try {

await axios.get('/api', { timeout: 5000 });

} catch (error) {

// error.code = 'ETIMEDOUT'

// error.message = 'timeout of 5000ms exceeded'

}

// 3. Node.js 底层(如果是Node.js环境)

const net = require('net');

const socket = net.createConnection();

socket.on('error', (err) => {

// err.code = 'ETIMEDOUT' (来自系统调用)

});

// 4. 系统层(Linux)

// 系统调用返回错误码: ETIMEDOUT (110)

```

**六、完整的错误码对照表**

| 错误码 | 全称 | POSIX编号 | 中文含义 | 常见场景 |

|--------|------|-----------|----------|----------|

| `ECONNABORTED` | Connection Aborted | 103 | 连接中止 | 客户端主动取消、代理中断 |

| `ETIMEDOUT` | Connection Timed Out | 110 | 连接超时 | 网络延迟、服务器响应慢 |

| `ECONNRESET` | Connection Reset | 104 | 连接重置 | 服务器崩溃、防火墙阻断 |

| `ECONNREFUSED` | Connection Refused | 111 | 连接被拒绝 | 端口未监听、服务未启动 |

| `ENOTFOUND` | Host Not Found | - | 主机未找到 | DNS解析失败 |

| `EADDRINUSE` | Address Already In Use | 98 | 地址已被使用 | 端口被占用 |

| `EACCES` | Permission Denied | 13 | 权限不足 | 文件/端口权限问题 |

**七、如何查看系统错误码**

**在 Linux/Mac 中:**

```bash

查看所有错误码

errno -l

查看特定错误码

perl -e 'print !+0, "\\n" if ! = "ETIMEDOUT";'

C语言中

#include <errno.h>

#include <stdio.h>

printf("ETIMEDOUT code: %d\n", ETIMEDOUT);

```

**在 Node.js 中:**

```javascript

// 查看错误码定义

const os = require('os');

console.log(os.constants.errno);

// 常见的

console.log({

ECONNABORTED: os.constants.errno.ECONNABORTED,

ETIMEDOUT: os.constants.errno.ETIMEDOUT,

ECONNRESET: os.constants.errno.ECONNRESET,

});

```

**总结**

  1. **命名规则**: `E` + 描述性英文(全大写)

  2. **来源**: POSIX/Unix 标准,被各种系统继承

  3. **层级**: 系统层 → 运行时层 → 应用层

  4. **映射**: 不同环境(浏览器/Node.js)错误码可能不同,但有对应关系

这些错误码是网络编程的通用语言,了解它们有助于更准确地诊断和解决问题。

相关推荐
念念不忘 必有回响2 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js
C澒2 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架
崔庆才丨静觅2 小时前
稳定好用的 ADSL 拨号代理,就这家了!
前端
江湖有缘2 小时前
Docker部署music-tag-web音乐标签编辑器
前端·docker·编辑器
恋猫de小郭3 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅10 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606110 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了11 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅11 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅11 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端