Skip to content

API 错误码对照表

本文档详细说明了源丰后端API系统中所有错误码的含义、原因和解决方案。

📋 概述

API使用统一的错误响应格式,所有错误都会返回相应的状态码和错误信息。理解这些错误码有助于快速定位和解决问题。

🎯 通用响应格式

成功响应

json
{
  "success": true,
  "message": "操作成功",
  "data": { /* 具体数据 */ }
}

错误响应

简单错误响应

json
{
  "success": false,
  "message": "资源不存在"
}

字段验证错误响应

json
{
  "success": false,
  "message": "参数验证失败",
  "errors": [
    {
      "field": "用户名",
      "tag": "min",
      "value": "ab",
      "message": "字段 '用户名' 长度不能小于 3 位",
      "param": "3"
    },
    {
      "field": "邮箱",
      "tag": "email",
      "value": "invalid-email",
      "message": "字段 '邮箱' 邮箱格式不正确",
      "param": ""
    }
  ]
}

🔢 HTTP 状态码

状态码类别说明
200成功请求处理成功
201成功资源创建成功
204成功请求成功,无返回内容
400客户端错误请求参数错误
401客户端错误未授权,需要登录
403客户端错误权限不足
404客户端错误资源不存在
409客户端错误资源冲突
422客户端错误参数验证失败
429客户端错误请求频率超限
500服务器错误服务器内部错误
502服务器错误网关错误
503服务器错误服务不可用

📊 业务错误码详解

认证授权相关 (AUTH_***)

错误码状态码说明常见原因解决方案
AUTH_INVALID_CREDENTIALS401无效的登录凭据用户名或密码错误检查用户名和密码,重新输入
AUTH_TOKEN_EXPIRED401访问令牌已过期Token超过有效期重新登录获取新token
AUTH_TOKEN_INVALID401无效的访问令牌Token格式错误或被篡改重新登录获取新token
AUTH_TOKEN_MISSING401缺少访问令牌请求头未携带Authorization添加Bearer token到请求头
AUTH_USER_NOT_FOUND404用户不存在用户ID不存在检查用户ID或联系管理员
AUTH_USER_DISABLED403用户账户已禁用用户被管理员禁用联系管理员启用账户
AUTH_ACCOUNT_LOCKED423账户已锁定多次登录失败被锁定等待解锁时间或联系管理员
AUTH_PERMISSION_DENIED403权限不足用户无访问权限联系管理员分配相应权限

用户管理相关 (USER_***)

错误码状态码说明常见原因解决方案
USER_ALREADY_EXISTS409用户已存在邮箱或手机号已被注册使用其他邮箱或手机号
USER_EMAIL_INVALID400邮箱格式无效邮箱格式不正确检查邮箱格式
USER_PHONE_INVALID400手机号格式无效手机号格式不正确检查手机号格式
USER_PASSWORD_WEAK400密码强度不足密码过于简单使用更复杂的密码
USER_PASSWORD_INCORRECT400原密码错误修改密码时原密码不正确确认原密码是否正确
USER_PROFILE_INCOMPLETE400用户资料不完整必填字段缺失补充完整的用户资料
USER_AVATAR_TOO_LARGE400头像文件过大头像超过大小限制压缩图片或选择更小的文件

员工管理相关 (EMPLOYEE_***)

错误码状态码说明常见原因解决方案
EMPLOYEE_ALREADY_EXISTS409员工已存在员工工号或身份证重复检查工号和身份证号
EMPLOYEE_NOT_FOUND404员工不存在员工ID不存在检查员工ID
EMPLOYEE_DEPARTMENT_INVALID400部门无效部门ID不存在选择有效的部门
EMPLOYEE_POSITION_INVALID400职位无效职位设置不正确检查职位配置
EMPLOYEE_STATUS_INVALID400员工状态无效状态值不在允许范围内使用正确的状态值
EMPLOYEE_DELETE_ACTIVE409无法删除在职员工员工处于在职状态先修改员工状态为离职

公司管理相关 (COMPANY_***)

错误码状态码说明常见原因解决方案
COMPANY_ALREADY_EXISTS409公司已存在公司名称或统一信用代码重复检查公司信息
COMPANY_NOT_FOUND404公司不存在公司ID不存在检查公司ID
COMPANY_NAME_INVALID400公司名称无效公司名称格式不正确使用规范的公司名称
COMPANY_CODE_INVALID400统一信用代码无效代码格式不正确检查统一信用代码格式
COMPANY_STATUS_INVALID400公司状态无效状态值不在允许范围内使用正确的状态值
COMPANY_QUOTA_EXCEEDED429公司配额超限员工数量超过限制联系管理员增加配额

考勤管理相关 (ATTENDANCE_***)

错误码状态码说明常见原因解决方案
ATTENDANCE_ALREADY_CLOCKED_IN409今日已上班打卡重复上班打卡检查打卡记录
ATTENDANCE_ALREADY_CLOCKED_OUT409今日已下班打卡重复下班打卡检查打卡记录
ATTENDANCE_NOT_CLOCKED_IN400今日未上班打卡下班打卡前未上班打卡先进行上班打卡
ATTENDANCE_LOCATION_INVALID400打卡位置无效不在允许的打卡范围内移动到允许范围内打卡
ATTENDANCE_TIME_INVALID400打卡时间无效不在允许的打卡时间范围内在允许时间内打卡
ATTENDANCE_RULE_NOT_FOUND404考勤规则不存在规则ID不存在检查规则ID
ATTENDANCE_GROUP_NOT_FOUND404考勤组不存在考勤组ID不存在检查考勤组ID

薪资管理相关 (SALARY_***)

错误码状态码说明常见原因解决方案
SALARY_ALREADY_EXISTS409薪资记录已存在该月薪资已生成检查薪资记录
SALARY_NOT_FOUND404薪资记录不存在薪资ID不存在检查薪资ID
SALARY_PERIOD_INVALID400薪资期间无效月份格式不正确使用正确的年月格式
SALARY_AMOUNT_INVALID400薪资金额无效金额为负数或超出范围检查金额输入
SALARY_CATEGORY_NOT_FOUND404薪资分类不存在分类ID不存在检查分类ID
SALARY_STATUS_INVALID400薪资状态无效状态值不在允许范围内使用正确的状态值
SALARY_CALCULATION_ERROR500薪资计算错误计算逻辑异常联系技术支持

待办事项相关 (TODO_***)

错误码状态码说明常见原因解决方案
TODO_NOT_FOUND404待办事项不存在待办事项ID不存在检查待办事项ID
TODO_ACCESS_DENIED403无访问权限不是创建者或被指派人检查权限设置
TODO_STATUS_INVALID400状态无效状态值不在允许范围内使用正确的状态值
TODO_PRIORITY_INVALID400优先级无效优先级值不在允许范围内使用正确的优先级
TODO_DUE_DATE_PAST400截止日期已过期截止日期早于当前日期使用未来的日期
TODO_ASSIGNMENT_INVALID400指派无效指派给不存在的人检查指派对象

文件管理相关 (FILE_***)

错误码状态码说明常见原因解决方案
FILE_NOT_FOUND404文件不存在文件ID或路径不存在检查文件ID
FILE_TOO_LARGE413文件过大文件超过大小限制压缩文件或选择小文件
FILE_TYPE_INVALID400文件类型无效不支持的文件类型使用支持的文件类型
FILE_UPLOAD_FAILED500文件上传失败网络错误或存储问题检查网络连接,重试上传
FILE_DELETE_FAILED500文件删除失败权限不足或文件不存在检查权限和文件存在性
FILE_QUOTA_EXCEEDED429存储配额超限超过存储空间限制清理无用文件或增加配额

消息通知相关 (MESSAGE_***)

错误码状态码说明常见原因解决方案
MESSAGE_NOT_FOUND404消息不存在消息ID不存在检查消息ID
MESSAGE_ACCESS_DENIED403无访问权限不是消息接收者检查权限设置
MESSAGE_ALREADY_READ409消息已读重复标记已读检查消息状态
MESSAGE_RECIPIENT_INVALID400接收者无效接收者ID不存在检查接收者ID
MESSAGE_CONTENT_TOO_LONG400内容过长消息内容超过限制缩短消息内容

系统相关 (SYSTEM_***)

错误码状态码说明常见原因解决方案
SYSTEM_MAINTENANCE503系统维护中系统正在进行维护等待维护完成
SYSTEM_OVERLOAD503系统过载请求量超过系统负载稍后重试
SYSTEM_DATABASE_ERROR500数据库错误数据库连接或查询异常联系技术支持
SYSTEM_CACHE_ERROR500缓存错误缓存服务异常联系技术支持
SYSTEM_EXTERNAL_SERVICE_ERROR502外部服务错误依赖的外部服务异常稍后重试或联系技术支持

🔧 错误处理最佳实践

客户端错误处理

javascript
// JavaScript 错误处理示例
async function apiRequest(url, options = {}) {
  try {
    const response = await fetch(url, {
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`,
        ...options.headers
      },
      ...options
    });

    const data = await response.json();

    if (!response.ok) {
      // 根据状态码处理不同错误
      switch (response.status) {
        case 401:
          // 处理认证错误
          handleAuthError(data);
          break;
        case 403:
          // 处理权限错误
          handlePermissionError(data);
          break;
        case 404:
          // 处理资源不存在错误
          handleNotFoundError(data);
          break;
        case 422:
          // 处理参数验证错误
          handleValidationError(data);
          break;
        default:
          // 处理其他错误
          handleGenericError(data);
      }
      return null;
    }

    return data;
  } catch (error) {
    // 处理网络错误
    handleNetworkError(error);
    return null;
  }
}

function handleAuthError(errorData) {
  // 清除本地token,跳转到登录页
  localStorage.removeItem('token');
  window.location.href = '/login';
}

function handleValidationError(errorData) {
  // 显示具体的字段错误信息
  if (errorData.errors) {
    errorData.errors.forEach(error => {
      showFieldError(error.field, error.message);
    });
  } else {
    showErrorMessage(errorData.message);
  }
}

Python 错误处理示例

python
import requests
from typing import Optional, Dict, Any

class APIClient:
    def __init__(self, base_url: str):
        self.base_url = base_url
        self.token = None

    def request(self, method: str, endpoint: str, data: Optional[Dict] = None) -> Dict[str, Any]:
        url = f"{self.base_url}{endpoint}"
        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {self.token}'
        }

        try:
            response = requests.request(method, url, headers=headers, json=data)
            response_data = response.json()

            if response.ok:
                return response_data
            else:
                self.handle_error(response.status_code, response_data)
                return {}

        except requests.exceptions.RequestException as e:
            self.handle_network_error(e)
            return {}

    def handle_error(self, status_code: int, error_data: Dict[str, Any]):
        if status_code == 401:
            print("认证失败,请重新登录")
            self.token = None
        elif status_code == 403:
            print("权限不足")
        elif status_code == 404:
            print("资源不存在")
        elif status_code == 422:
            print(f"参数验证失败: {error_data.get('message', '')}")
        else:
            print(f"请求失败: {error_data.get('message', '未知错误')}")

    def handle_network_error(self, error: requests.exceptions.RequestException):
        print(f"网络错误: {str(error)}")

📱 错误信息显示建议

前端错误提示

  1. 用户友好的错误信息: 将技术错误码转换为用户能理解的语言
  2. 具体的操作指导: 告诉用户如何解决问题
  3. 错误分类显示: 根据错误严重程度使用不同的提示样式
  4. 错误日志记录: 记录详细错误信息便于调试

移动端适配

  • 使用Toast或弹窗显示错误信息
  • 考虑屏幕空间限制,提供简洁的错误描述
  • 提供"重试"按钮方便用户操作

🔄 重试机制

自动重试策略

javascript
// 自动重试函数
async function retryRequest(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      const response = await fetch(url, options);
      if (response.ok) {
        return await response.json();
      }

      // 如果是客户端错误,不重试
      if (response.status >= 400 && response.status < 500) {
        throw new Error(`Client error: ${response.status}`);
      }

      // 如果是服务器错误,等待后重试
      if (response.status >= 500) {
        await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
        continue;
      }
    } catch (error) {
      if (i === maxRetries - 1) {
        throw error;
      }
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
}

📞 获取帮助

如果您遇到无法解决的错误:

  1. 查看文档: 参考相关API文档和错误码说明
  2. 检查日志: 查看浏览器控制台或服务器日志
  3. 联系支持: 提供错误码、请求信息和复现步骤
  4. 社区求助: 在开发者社区寻求帮助

最后更新: 2024-01-24 文档版本: v1.0 维护团队: 源丰后端开发团队

基于 MIT 许可发布