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 中使用独立模式来定义可重用的验证模式,这些模式与路由特定的模式共存。

- - meta
  - property: 'og:description'
    content: 学习如何在 Elysia 中使用独立模式来定义可重用的验证模式,这些模式与路由特定的模式共存。

独立模式

当我们使用 Guard 定义模式时,该模式将被添加到路由中。但如果路由提供了模式,它将被覆盖

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.guard({
		body: t.Object({
			age: t.Number()
		})
	})
	.post(
		'/user',
		({ body }) => body,
		{
			// 这将覆盖 guard 模式
			body: t.Object({
				name: t.String()
			})
		}
	)
	.listen(3000)

如果我们希望模式与路由模式共存,我们可以将其定义为独立模式

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.guard({
		schema: 'standalone', 
		body: t.Object({
			age: t.Number()
		})
	})
	.post(
		'/user',
		// body 将同时具有 age 和 name 属性
		({ body }) => body,
		{
			body: t.Object({
				name: t.String()
			})
		}
	)
	.listen(3000)

模式库互操作性

独立模式之间的模式可以来自不同的验证库。

例如,您可以使用 zod 定义独立模式,使用 Elysia.t 定义本地模式,两者将可以互换使用。

练习

让我们使用独立模式使请求体中的 agename 属性都成为必需项。

  1. Standalone Schema

    Let's make POST '/user' endpoint accept a body with `name` as string and `age` as number by modifying a guard schema to be a standalone schema

Show answer

我们可以通过在 guard 选项中添加 schema: 'standalone' 来定义独立模式。

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

new Elysia()
	.guard({
		schema: 'standalone', 
		body: z.object({
			age: z.number()
		})
	})
	.post(
		'/user',
		({ body }) => body,
		{
			body: t.Object({
				name: t.String()
			})
		}
	)
	.listen(3000)
  • index.ts