- 新增auth.schema.ts: 用户注册请求参数Schema定义和类型导出 - 新增auth.response.ts: 注册成功/失败响应格式定义 - 新增auth.service.ts: 注册业务逻辑,包含验证码验证、用户名邮箱唯一性检查、密码加密 - 新增auth.controller.ts: POST /api/auth/register路由实现,包含错误处理 - 新增auth.test.ts: 完整测试用例覆盖正常、异常、边界场景(14个测试全通过) - 修复数据库日期时间插入问题和路由路径重复问题 关联PRD: M2-基础用户系统,任务1.0完成
180 lines
6.9 KiB
TypeScript
180 lines
6.9 KiB
TypeScript
/**
|
|
* @file 统一错误码定义
|
|
* @author AI助手
|
|
* @date 2025-06-29
|
|
* @description 定义整个应用的统一错误码,提供类型安全的错误处理
|
|
*/
|
|
|
|
/**
|
|
* 应用错误码枚举
|
|
* @description 统一管理所有错误码,确保错误处理的一致性
|
|
*/
|
|
export const ERROR_CODES = {
|
|
// 成功
|
|
SUCCESS: 'SUCCESS',
|
|
|
|
// 客户端错误 4xx
|
|
VALIDATION_ERROR: 'VALIDATION_ERROR', // 参数验证失败
|
|
UNAUTHORIZED: 'UNAUTHORIZED', // 未授权
|
|
FORBIDDEN: 'FORBIDDEN', // 禁止访问
|
|
NOT_FOUND: 'NOT_FOUND', // 资源不存在
|
|
METHOD_NOT_ALLOWED: 'METHOD_NOT_ALLOWED', // 方法不允许
|
|
CONFLICT: 'CONFLICT', // 资源冲突
|
|
RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED', // 请求频率超限
|
|
|
|
// 业务错误 4xx
|
|
BUSINESS_ERROR: 'BUSINESS_ERROR', // 通用业务错误
|
|
USER_NOT_FOUND: 'USER_NOT_FOUND', // 用户不存在
|
|
USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS', // 用户已存在
|
|
INVALID_CREDENTIALS: 'INVALID_CREDENTIALS', // 凭据无效
|
|
TOKEN_EXPIRED: 'TOKEN_EXPIRED', // Token过期
|
|
TOKEN_INVALID: 'TOKEN_INVALID', // Token无效
|
|
INSUFFICIENT_PERMISSIONS: 'INSUFFICIENT_PERMISSIONS', // 权限不足
|
|
|
|
// 用户注册相关错误
|
|
USERNAME_EXISTS: 'USERNAME_EXISTS', // 用户名已存在
|
|
EMAIL_EXISTS: 'EMAIL_EXISTS', // 邮箱已存在
|
|
PASSWORD_MISMATCH: 'PASSWORD_MISMATCH', // 密码不匹配
|
|
CAPTCHA_ERROR: 'CAPTCHA_ERROR', // 验证码错误
|
|
EMAIL_SEND_FAILED: 'EMAIL_SEND_FAILED', // 邮件发送失败
|
|
|
|
// 用户激活相关错误
|
|
INVALID_ACTIVATION_TOKEN: 'INVALID_ACTIVATION_TOKEN', // 激活令牌无效
|
|
ALREADY_ACTIVATED: 'ALREADY_ACTIVATED', // 已经激活
|
|
|
|
// 用户登录相关错误
|
|
INVALID_PASSWORD: 'INVALID_PASSWORD', // 密码错误
|
|
ACCOUNT_NOT_ACTIVATED: 'ACCOUNT_NOT_ACTIVATED', // 账号未激活
|
|
ACCOUNT_LOCKED: 'ACCOUNT_LOCKED', // 账号被锁定
|
|
TOO_MANY_FAILED_ATTEMPTS: 'TOO_MANY_FAILED_ATTEMPTS', // 失败次数过多
|
|
|
|
// 密码重置相关错误
|
|
INVALID_RESET_TOKEN: 'INVALID_RESET_TOKEN', // 重置令牌无效
|
|
|
|
// 系统状态
|
|
NOT_IMPLEMENTED: 'NOT_IMPLEMENTED', // 功能未实现
|
|
|
|
// 服务器错误 5xx
|
|
INTERNAL_ERROR: 'INTERNAL_ERROR', // 内部服务器错误
|
|
DATABASE_ERROR: 'DATABASE_ERROR', // 数据库错误
|
|
REDIS_ERROR: 'REDIS_ERROR', // Redis错误
|
|
EXTERNAL_API_ERROR: 'EXTERNAL_API_ERROR', // 外部API错误
|
|
SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE', // 服务不可用
|
|
} as const;
|
|
|
|
/**
|
|
* 错误码类型
|
|
*/
|
|
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];
|
|
|
|
/**
|
|
* 错误码到HTTP状态码的映射
|
|
*/
|
|
export const ERROR_CODE_TO_HTTP_STATUS: Record<ErrorCode, number> = {
|
|
// 成功
|
|
[ERROR_CODES.SUCCESS]: 200,
|
|
|
|
// 客户端错误 4xx
|
|
[ERROR_CODES.VALIDATION_ERROR]: 400,
|
|
[ERROR_CODES.UNAUTHORIZED]: 401,
|
|
[ERROR_CODES.FORBIDDEN]: 403,
|
|
[ERROR_CODES.NOT_FOUND]: 404,
|
|
[ERROR_CODES.METHOD_NOT_ALLOWED]: 405,
|
|
[ERROR_CODES.CONFLICT]: 409,
|
|
[ERROR_CODES.RATE_LIMIT_EXCEEDED]: 429,
|
|
|
|
// 业务错误 4xx
|
|
[ERROR_CODES.BUSINESS_ERROR]: 400,
|
|
[ERROR_CODES.USER_NOT_FOUND]: 404,
|
|
[ERROR_CODES.USER_ALREADY_EXISTS]: 409,
|
|
[ERROR_CODES.INVALID_CREDENTIALS]: 401,
|
|
[ERROR_CODES.TOKEN_EXPIRED]: 401,
|
|
[ERROR_CODES.TOKEN_INVALID]: 401,
|
|
[ERROR_CODES.INSUFFICIENT_PERMISSIONS]: 403,
|
|
|
|
// 用户注册相关错误
|
|
[ERROR_CODES.USERNAME_EXISTS]: 409,
|
|
[ERROR_CODES.EMAIL_EXISTS]: 409,
|
|
[ERROR_CODES.PASSWORD_MISMATCH]: 400,
|
|
[ERROR_CODES.CAPTCHA_ERROR]: 400,
|
|
[ERROR_CODES.EMAIL_SEND_FAILED]: 500,
|
|
|
|
// 用户激活相关错误
|
|
[ERROR_CODES.INVALID_ACTIVATION_TOKEN]: 400,
|
|
[ERROR_CODES.ALREADY_ACTIVATED]: 409,
|
|
|
|
// 用户登录相关错误
|
|
[ERROR_CODES.INVALID_PASSWORD]: 401,
|
|
[ERROR_CODES.ACCOUNT_NOT_ACTIVATED]: 403,
|
|
[ERROR_CODES.ACCOUNT_LOCKED]: 403,
|
|
[ERROR_CODES.TOO_MANY_FAILED_ATTEMPTS]: 429,
|
|
|
|
// 密码重置相关错误
|
|
[ERROR_CODES.INVALID_RESET_TOKEN]: 400,
|
|
|
|
// 系统状态
|
|
[ERROR_CODES.NOT_IMPLEMENTED]: 501,
|
|
|
|
// 服务器错误 5xx
|
|
[ERROR_CODES.INTERNAL_ERROR]: 500,
|
|
[ERROR_CODES.DATABASE_ERROR]: 500,
|
|
[ERROR_CODES.REDIS_ERROR]: 500,
|
|
[ERROR_CODES.EXTERNAL_API_ERROR]: 502,
|
|
[ERROR_CODES.SERVICE_UNAVAILABLE]: 503,
|
|
};
|
|
|
|
/**
|
|
* 错误码描述映射
|
|
*/
|
|
export const ERROR_CODE_MESSAGES: Record<ErrorCode, string> = {
|
|
// 成功
|
|
[ERROR_CODES.SUCCESS]: '操作成功',
|
|
|
|
// 客户端错误
|
|
[ERROR_CODES.VALIDATION_ERROR]: '请求参数验证失败',
|
|
[ERROR_CODES.UNAUTHORIZED]: '未授权访问',
|
|
[ERROR_CODES.FORBIDDEN]: '禁止访问',
|
|
[ERROR_CODES.NOT_FOUND]: '请求的资源不存在',
|
|
[ERROR_CODES.METHOD_NOT_ALLOWED]: '请求方法不被允许',
|
|
[ERROR_CODES.CONFLICT]: '请求与当前资源状态冲突',
|
|
[ERROR_CODES.RATE_LIMIT_EXCEEDED]: '请求频率超过限制',
|
|
|
|
// 业务错误
|
|
[ERROR_CODES.BUSINESS_ERROR]: '业务处理失败',
|
|
[ERROR_CODES.USER_NOT_FOUND]: '用户不存在',
|
|
[ERROR_CODES.USER_ALREADY_EXISTS]: '用户已存在',
|
|
[ERROR_CODES.INVALID_CREDENTIALS]: '用户名或密码错误',
|
|
[ERROR_CODES.TOKEN_EXPIRED]: '访问令牌已过期',
|
|
[ERROR_CODES.TOKEN_INVALID]: '访问令牌无效',
|
|
[ERROR_CODES.INSUFFICIENT_PERMISSIONS]: '权限不足',
|
|
|
|
// 用户注册相关错误
|
|
[ERROR_CODES.USERNAME_EXISTS]: '用户名已存在',
|
|
[ERROR_CODES.EMAIL_EXISTS]: '邮箱已被注册',
|
|
[ERROR_CODES.PASSWORD_MISMATCH]: '两次输入的密码不一致',
|
|
[ERROR_CODES.CAPTCHA_ERROR]: '验证码错误或已过期',
|
|
[ERROR_CODES.EMAIL_SEND_FAILED]: '邮件发送失败',
|
|
|
|
// 用户激活相关错误
|
|
[ERROR_CODES.INVALID_ACTIVATION_TOKEN]: '激活令牌无效或已过期',
|
|
[ERROR_CODES.ALREADY_ACTIVATED]: '账号已经激活',
|
|
|
|
// 用户登录相关错误
|
|
[ERROR_CODES.INVALID_PASSWORD]: '密码错误',
|
|
[ERROR_CODES.ACCOUNT_NOT_ACTIVATED]: '账号未激活',
|
|
[ERROR_CODES.ACCOUNT_LOCKED]: '账号已被锁定',
|
|
[ERROR_CODES.TOO_MANY_FAILED_ATTEMPTS]: '登录失败次数过多',
|
|
|
|
// 密码重置相关错误
|
|
[ERROR_CODES.INVALID_RESET_TOKEN]: '重置令牌无效或已过期',
|
|
|
|
// 系统状态
|
|
[ERROR_CODES.NOT_IMPLEMENTED]: '功能未实现',
|
|
|
|
// 服务器错误
|
|
[ERROR_CODES.INTERNAL_ERROR]: '服务器内部错误',
|
|
[ERROR_CODES.DATABASE_ERROR]: '数据库操作失败',
|
|
[ERROR_CODES.REDIS_ERROR]: 'Redis操作失败',
|
|
[ERROR_CODES.EXTERNAL_API_ERROR]: '外部服务调用失败',
|
|
[ERROR_CODES.SERVICE_UNAVAILABLE]: '服务暂时不可用',
|
|
};
|