Skip to content

Commit 491d894

Browse files
authored
Merge pull request #885 from crishoj/unwrap-transform-errors
fix: unwrap transform errors
2 parents a3ed6c1 + babd91a commit 491d894

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

src/compose.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2344,9 +2344,10 @@ export const composeErrorHandler = (
23442344
}
23452345

23462346
fnLiteral += `if(error.constructor.name === "ValidationError" || error.constructor.name === "TransformDecodeError") {
2347-
set.status = error.status ?? 422
2347+
const reportedError = error.error ?? error
2348+
set.status = reportedError.status ?? 422
23482349
return new Response(
2349-
error.message,
2350+
reportedError.message,
23502351
{
23512352
headers: Object.assign(
23522353
{ 'content-type': 'application/json'},

src/dynamic-handle.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { redirect, signCookie, StatusMap } from './utils'
1717
import { parseCookie } from './cookies'
1818

1919
import type { Handler, LifeCycleStore, SchemaValidator } from './types'
20+
import { TransformDecodeError } from '@sinclair/typebox/value'
2021

2122
// JIT Handler
2223
export type DynamicHandler = {
@@ -420,11 +421,13 @@ export const createDynamicHandler =
420421

421422
return (context.response = mapResponse(response, context.set))
422423
} catch (error) {
423-
if ((error as ElysiaErrors).status)
424-
set.status = (error as ElysiaErrors).status
425-
424+
const reportedError = (error instanceof TransformDecodeError && error.error)
425+
? error.error
426+
: error
427+
if ((reportedError as ElysiaErrors).status)
428+
set.status = (reportedError as ElysiaErrors).status
426429
// @ts-expect-error private
427-
return app.handleError(context, error)
430+
return app.handleError(context, reportedError)
428431
} finally {
429432
for (const afterResponse of app.event.afterResponse)
430433
await afterResponse.fn(context as any)

test/core/handle-error.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,25 @@ describe('Handle Error', () => {
204204
'APIError'
205205
)
206206
})
207+
208+
it('handle error in Transform', async () => {
209+
const route = new Elysia().get('/', ({query: {aid}}) => aid, {
210+
query: t.Object({
211+
aid: t.Transform(t.String())
212+
.Decode((value) => {
213+
throw new NotFoundError('foo')
214+
})
215+
.Encode((value) => `1`)
216+
})
217+
})
218+
219+
let response = await (new Elysia({ aot: false })).use(route).handle(req('/?aid=a'))
220+
expect(response.status).toEqual(404)
221+
expect(await response.text()).toEqual('foo')
222+
223+
response = await (new Elysia({aot: true})).use(route).handle(req('/?aid=a'))
224+
expect(response.status).toEqual(404)
225+
expect(await response.text()).toEqual('foo')
226+
})
227+
207228
})

0 commit comments

Comments
 (0)