Error Handling

onError에러가 발생했을 때 호출됩니다.

핸들러와 유사한 context를 받지만 다음과 같은 추가 항목이 있습니다:

  • error - 발생한 에러
  • code - 에러 코드
typescript
import { Elysia } from 'elysia'

new Elysia()
	.onError(({ error, code }) => {
		if(code === "NOT_FOUND")
			return 'uhe~ are you lost?'

		return status(418, "My bad! But I\'m cute so you'll forgive me, right?")
	})
	.get('/', () => 'ok')
	.listen(3000)
status를 반환하여 기본 에러 상태를 재정의할 수 있습니다.

Custom Error

다음과 같이 error code를 사용하여 커스텀 에러를 제공할 수 있습니다:

typescript
import { Elysia } from 'elysia'

class NicheError extends Error {
	constructor(message: string) {
		super(message)
	}
}

new Elysia()
	.error({ 
		'NICHE': NicheError 
	}) 
	.onError(({ error, code, status }) => {
		if(code === 'NICHE') {
			// Typed as NicheError
			console.log(error)

			return status(418, "We have no idea how you got here")
		}
	})
	.get('/', () => {
		throw new CustomError('Custom error message')
	})
	.listen(3000)

Elysia는 error code를 사용하여 에러 타입을 좁힙니다.

Elysia가 타입을 좁힐 수 있도록 커스텀 에러를 등록하는 것이 권장됩니다.

Error Status Code

클래스에 status 속성을 추가하여 커스텀 상태 코드를 제공할 수도 있습니다:

typescript
import { Elysia } from 'elysia'

class NicheError extends Error {
	status = 418

	constructor(message: string) {
		super(message)
	}
}

에러가 발생하면 Elysia는 이 상태 코드를 사용합니다. Custom Status Code를 참조하세요.

Error Response

toResponse 메서드를 제공하여 에러에 직접 커스텀 에러 응답을 정의할 수도 있습니다:

typescript
import { Elysia } from 'elysia'

class NicheError extends Error {
	status = 418

	constructor(message: string) {
		super(message)
	}

	toResponse() { 
		return { message: this.message } 
	} 
}

에러가 발생하면 Elysia는 이 응답을 사용합니다. Custom Error Response를 참조하세요.

Assignment

Elysia의 context를 확장해 봅시다.

  1. Your own 404

    Let's override a default 404 response your own

  2. Your Custom Error

    Let's define your own custom error, throw it in GET "/" endpoint, and return a status 418

Show answer
1. "NOT_FOUND"로 에러를 좁혀서 404 응답을 재정의할 수 있습니다. 2. status 속성이 418인 에러를 `.error()` 메서드에 제공합니다.
typescript
import { Elysia } from 'elysia'

class YourError extends Error {
	status = 418

	constructor(message: string) {
		super(message)
	}
}

new Elysia()
	.error({
		"YOUR_ERROR": YourError
	})
	.onError(({ code, status }) => {
		if(code === "NOT_FOUND")
			return "Hi there"
	})
	.get('/', () => {
		throw new YourError("A")
	})
	.listen(3000)
  • index.ts

Error

Error: No Elysia server is running in index.ts
Did you forget to call `.listen()`?
    at parse (file:///vercel/path0/docs/.vitepress/.temp/utils.J44kKQwQ.js:202:66)
    at file:///vercel/path0/docs/.vitepress/.temp/utils.J44kKQwQ.js:240:30
    at new Promise (<anonymous>)
    at execute (file:///vercel/path0/docs/.vitepress/.temp/utils.J44kKQwQ.js:238:49)
    at Proxy.run (file:///vercel/path0/docs/.vitepress/.temp/store.CFqL75-f.js:190:51)
    at Proxy.wrappedAction (file:///vercel/path0/node_modules/pinia/dist/pinia.mjs:1394:26)
    at setup (file:///vercel/path0/docs/.vitepress/.temp/playground.eEZCBItr.js:133:50)
    at playground_vue_vue_type_script_setup_true_lang_default.setup (file:///vercel/path0/docs/.vitepress/.temp/playground.eEZCBItr.js:438:22)
    at callWithErrorHandling (/vercel/path0/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js:86:19)
    at setupStatefulComponent (/vercel/path0/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js:6365:25)