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)