Skip to content
Our Sponsors
Open in Anthropic

title: 验证 - Elysia 教程 layout: false search: false authors: [] head: - - meta - property: 'og:title' content: 验证 - Elysia 教程

- - meta
  - name: 'description'
    content: Elysia 使用 Schema 提供内置的数据验证,以确保请求和响应数据的完整性。

- - meta
  - property: 'og:description'
    content: Elysia 使用 Schema 提供内置的数据验证,以确保请求和响应数据的完整性。

验证

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 错误。

查看 验证

使用您自己的

或者,Elysia 支持 Standard Schema,允许您使用您选择的库,例如 zodyupvalibot

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 了解所有兼容的模式。

验证类型

您可以验证以下属性:

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

一旦定义了模式,Elysia 将为您推断类型,因此您不必在 TypeScript 中单独定义模式。

查看 Schema Type 了解每种类型。

响应验证

当您为 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)

查看 响应验证

练习

让我们练习一下所学的内容。

  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.Objectbody 属性定义一个模式。

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