/** * @file 全局错误处理中间件 * @author hotok * @date 2025-06-28 * @lastEditor hotok * @lastEditTime 2025-06-28 * @description 全局错误处理中间件,支持分环境详细度、自动错误日志记录 */ import { Elysia } from 'elysia'; /** * 全局错误处理插件 */ export const errorHandlerPlugin = (app: Elysia) => app.onError(({ error, set, code, log, env }) => { switch (code) { case 'VALIDATION': { set.status = 400; let errors = null as any; if (env === 'development') { errors = error.all.map((err) => ({ field: err.path?.slice(1) || 'root', message: err.message, expected: err.schema, received: err.value, })); } else { errors = error.all.map((err) => err.message); } return { code: 400, message: '参数验证失败', errors, }; } case 'NOT_FOUND': { set.status = 404; return { code: 404, message: '找不到资源', }; } case 'INTERNAL_SERVER_ERROR': { set.status = 500; log.error(error); return { code: 500, message: '服务器内部错误', errors: error.message, }; } case 'PARSE': { set.status = 400; return { code: 400, message: '解析错误', errors: error.message, }; } default: { // 处理 ElysiaCustomStatusResponse status抛出的异常 if (error?.constructor?.name === 'ElysiaCustomStatusResponse') { set.status = error.code; return { code: error.code, message: error.response.message || error.response || '服务器内部错误', errors: error, }; } console.log('error', error); set.status = 500; log.error(error); return { code: 500, message: '服务器内部错误', errors: error.message, }; } } });