Skip to content

Commit babd91a

Browse files
committed
🔧 fix: unwrap transform errors (#882)
1 parent 22b79ce commit babd91a

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
@@ -2343,9 +2343,10 @@ export const composeErrorHandler = (
23432343
}
23442344

23452345
fnLiteral += `if(error.constructor.name === "ValidationError" || error.constructor.name === "TransformDecodeError") {
2346-
set.status = error.status ?? 422
2346+
const reportedError = error.error ?? error
2347+
set.status = reportedError.status ?? 422
23472348
return new Response(
2348-
error.message,
2349+
reportedError.message,
23492350
{
23502351
headers: Object.assign(
23512352
{ '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)