/** * Nitro错误处理插件 * Nitro Error Handling Plugin */ import type { ApiResponse } from '@nuxt4crud/shared' export default defineNitroPlugin((nitroApp) => { nitroApp.hooks.hook('error', async (error, context) => { console.error('Nitro Error:', error) // 验证错误 if (error.validationErrors) { const response: ApiResponse = { success: false, error: '数据验证失败', data: error.validationErrors, } // 设置错误响应 if (context.event) { setResponseStatus(context.event, 400) setResponseHeader(context.event, 'Content-Type', 'application/json') await sendWebResponse(context.event, response) } return } // Prisma 错误 if (error.code === 'P2002') { const response: ApiResponse = { success: false, error: '数据已存在,请检查唯一性约束', } // 设置错误响应 if (context.event) { setResponseStatus(context.event, 409) setResponseHeader(context.event, 'Content-Type', 'application/json') await sendWebResponse(context.event, response) } return } if (error.code === 'P2025') { const response: ApiResponse = { success: false, error: '记录不存在', } // 设置错误响应 if (context.event) { setResponseStatus(context.event, 404) setResponseHeader(context.event, 'Content-Type', 'application/json') await sendWebResponse(context.event, response) } return } // 默认错误处理 const statusCode = error.statusCode || 500 const response: ApiResponse = { success: false, error: error.message || '服务器内部错误', } // 设置错误响应 if (context.event) { setResponseStatus(context.event, statusCode) setResponseHeader(context.event, 'Content-Type', 'application/json') await sendWebResponse(context.event, response) } }) })