init6
This commit is contained in:
73
server/plugins/error-handler.ts
Normal file
73
server/plugins/error-handler.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* 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)
|
||||
}
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user