59 lines
No EOL
1.3 KiB
TypeScript
59 lines
No EOL
1.3 KiB
TypeScript
import { Context } from 'hono';
|
|
import { HTTPException } from 'hono/http-exception';
|
|
import { ZodError } from 'zod';
|
|
import { appConfig } from '../config';
|
|
import { logger } from '../utils/logger';
|
|
|
|
export const errorHandler = (err: Error, c: Context) => {
|
|
logger.error('Error:', err);
|
|
|
|
// Handle Hono HTTP exceptions
|
|
if (err instanceof HTTPException) {
|
|
return c.json(
|
|
{ error: err.message },
|
|
err.status
|
|
);
|
|
}
|
|
|
|
// Handle Zod validation errors
|
|
if (err instanceof ZodError) {
|
|
return c.json(
|
|
{
|
|
error: 'Validation error',
|
|
details: err.errors.map(e => ({
|
|
path: e.path.join('.'),
|
|
message: e.message,
|
|
})),
|
|
},
|
|
400
|
|
);
|
|
}
|
|
|
|
// Handle Prisma errors
|
|
if (err.constructor.name === 'PrismaClientKnownRequestError') {
|
|
const prismaError = err as any;
|
|
|
|
if (prismaError.code === 'P2002') {
|
|
return c.json(
|
|
{ error: 'Duplicate entry' },
|
|
400
|
|
);
|
|
}
|
|
|
|
if (prismaError.code === 'P2025') {
|
|
return c.json(
|
|
{ error: 'Record not found' },
|
|
404
|
|
);
|
|
}
|
|
}
|
|
|
|
// Default error response
|
|
return c.json(
|
|
{
|
|
error: 'Internal server error',
|
|
message: appConfig.env === 'development' ? err.message : undefined,
|
|
},
|
|
500
|
|
);
|
|
}; |