Validation

Elysia는 기본적으로 데이터 유효성 검사를 제공합니다.

Elysia.t를 사용하여 스키마를 정의할 수 있습니다.

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.post(
		'/user',
		({ body: { name } }) => `Hello ${name}!`,
		{
			body: t.Object({
				name: t.String(),
				age: t.Number()
			})
		}
	)
	.listen(3000)

스키마를 정의하면 Elysia는 데이터가 올바른 형태인지 확인합니다.

데이터가 스키마와 일치하지 않으면 Elysia는 422 Unprocessable Entity 오류를 반환합니다.

자세한 내용은 Validation을 참조하세요.

Bring your own

또는 Elysia는 Standard Schema를 지원하므로 zod, yup 또는 valibot과 같이 선택한 라이브러리를 사용할 수 있습니다.

typescript
import { Elysia } from 'elysia'
import { z } from 'zod'

new Elysia()
	.post(
		'/user',
		({ body: { name } }) => `Hello ${name}!`,
		{
			body: z.object({
				name: z.string(),
				age: z.number()
			})
		}
	)
	.listen(3000)

모든 호환 가능한 스키마는 Standard Schema를 참조하세요.

Validation Type

다음 속성의 유효성을 검사할 수 있습니다:

  • body
  • query
  • params
  • headers
  • cookie
  • response

스키마가 정의되면 Elysia는 타입을 추론하므로 TypeScript에서 별도의 스키마를 정의할 필요가 없습니다.

각 타입에 대해서는 Schema Type을 참조하세요.

Response Validation

response에 대한 유효성 검사 스키마를 정의하면 Elysia는 클라이언트에 전송하기 전에 응답의 유효성을 검사하고 응답에 대한 타입 검사를 수행합니다.

어떤 상태 코드를 검증할지 지정할 수도 있습니다:

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.get(
		'/user',
		() => `Hello Elysia!`,
		{
			response: {
				200: t.Literal('Hello Elysia!'),
				418: t.Object({
					message: t.Literal("I'm a teapot")
				})
			}
		}
	)
	.listen(3000)

자세한 내용은 Response Validation을 참조하세요.

과제

배운 내용을 실습해 봅시다.

  1. Add a Body Schema

    Define a body schema for POST `/user` endpoint that accept an object with `name` property with type string, and return `Hello ${name}!`

Show answer

t.Object를 사용하여 스키마를 정의하고 body 속성에 제공할 수 있습니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
	.get('/', ({ status, set }) => {
		set.headers['x-powered-by'] = 'Elysia'

		return status(418, 'Hello Elysia!')
	})
	.get('/docs', ({ redirect }) => redirect('https://elysiajs.com'))
	.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)