Files
DianZhanDemo/server/plugins/error-handler.ts
ch197511161 aaaf08e8f3 init6
2025-12-11 02:09:07 +08:00

73 lines
2.0 KiB
TypeScript

/**
* 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)
}
})
})