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 小时前
CSS单位与字体样式全解析
前端·css·html
咖啡の猫2 小时前
TypeScript 开发环境搭建
前端·javascript·typescript
co松柏2 小时前
AI+Excalidraw,用自然语言画手绘风格技术图
前端·人工智能·后端
用户81274828151202 小时前
安卓Settings值原理源码剖析存储最大的字符数量是多少?
前端
用户81274828151202 小时前
安卓14剖析SystemUI的ShadeLogger/LogBuffer日志动态控制输出dumpsy机制
前端
Ankkaya2 小时前
cloudflare + github 实现留言板
前端·github
是你的小橘呀2 小时前
单页应用路由怎么搞?React Router 从原理到实战全解析!
前端·javascript
xuedaobian2 小时前
2025年我是怎么用AI写代码的
前端·程序员·ai编程
风止何安啊2 小时前
Set/Map+Weak三剑客的骚操作:JS 界的 “去重王者” ,“万能钥匙”和“隐形清洁工”
前端·javascript·面试