diff --git a/.changeset/thin-meals-know.md b/.changeset/thin-meals-know.md new file mode 100644 index 00000000..49ddd1cc --- /dev/null +++ b/.changeset/thin-meals-know.md @@ -0,0 +1,5 @@ +--- +'@smooai/utils': patch +--- + +Fix hono error handler. diff --git a/src/api/hono.spec.ts b/src/api/hono.spec.ts index be213d13..ec9842f4 100644 --- a/src/api/hono.spec.ts +++ b/src/api/hono.spec.ts @@ -95,7 +95,14 @@ describe('addHonoMiddleware', () => { }, }; - await expect(handler(event as any)).rejects.toThrow('Expected string, received number'); + const response = await handler(event as any); + expect(response.statusCode).toBe(400); + const responseBody = JSON.parse(response.body); + expect(responseBody.error).toContain('Expected string, received number'); + expect(responseBody.details).toBeDefined(); + expect(responseBody.details[0].code).toBe('invalid_type'); + expect(responseBody.details[0].expected).toBe('string'); + expect(responseBody.details[0].received).toBe('number'); }); it('should add pretty JSON middleware when running locally', async () => { diff --git a/src/api/hono.ts b/src/api/hono.ts index 5d5ab890..4e1e5e43 100644 --- a/src/api/hono.ts +++ b/src/api/hono.ts @@ -33,22 +33,41 @@ export function addHonoMiddleware(_app: Hono): Hono { app.use(prettyJSON()); } - app.onError((error) => { + app.onError((error, c) => { if (error instanceof HumanReadableSchemaError) { - logger.error(error, `A schema validation error occurred: ${error.message}`); - throw new HTTPException(400, { - cause: error, - message: error.message, - }); + logger.error(error, `A schema validation error occurred`); + + return c.json( + { + error: error.message, + schemaError: error.schemaError, + }, + 400, + ); } else if (error instanceof ZodError) { const validationError = fromZodError(error); - logger.error(error, `A validation error occurred: ${validationError.toString()}`); - throw new HTTPException(400, { - cause: error, - message: validationError.toString(), - }); + logger.error(validationError, `A validation error occurred`); + + return c.json( + { + error: validationError.message, + details: validationError.details, + }, + 400, + ); + } else if (error instanceof HTTPException) { + logger.error(error, `An HTTP error occurred`); + + return error.getResponse(); } - throw error; + + logger.error(error, `An unknown error occurred`); + return c.json( + { + error: error.message, + }, + 500, + ); }); return app;