73 lines
2.0 KiB
TypeScript
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)
|
|
}
|
|
})
|
|
}) |