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 中自定义验证错误消息,包括为无效输入提供详细的反馈。

验证错误

如果你使用 Elysia.t 进行验证,你可以根据未通过验证的字段提供自定义错误消息。

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.post(
		'/',
		({ body }) => body,
		{
			body: t.Object({
				age: t.Number({
					error: '年龄必须是数字'
				})
			}, {
				error: 'Body 必须是一个对象'
			})
		}
	)
	.listen(3000)

Elysia 会用你提供的自定义消息覆盖默认错误消息,详见 自定义验证消息

验证详情

默认情况下,Elysia 还会提供一个 验证详情 来解释验证出了什么问题,如下所示:

json
{
	"type": "validation",
	"on": "params",
	"value": { "id": "string" },
	"property": "/id",
	"message": "id 必须是一个数字", 
	"summary": "属性 'id' 应为以下之一:'numeric', 'number'",
	"found": { "id": "string" },
	"expected": { "id": 0 },
	"errors": [
		{
			"type": 62,
			"schema": {
				"anyOf": [
					{ "format": "numeric", "default": 0, "type": "string" },
					{ "type": "number" }
				]
			},
			"path": "/id",
			"value": "string",
			"message": "期望一个联合类型的值",
			"errors": [{ "iterator": {} }, { "iterator": {} }],
			"summary": "属性 'id' 应为以下之一:'numeric', 'number'"
		}
	]
}

但是,当你提供自定义错误消息时,它将完全覆盖 验证详情

要恢复验证详情,你可以将你的自定义错误消息包裹在一个 验证详情 函数中。

typescript
import { Elysia, t, validationDetail } from 'elysia'

new Elysia()
	.post(
		'/',
		({ body }) => body,
		{
			body: t.Object({
				age: t.Number({
					error: validationDetail('年龄必须是数字') 
				})
			}, {
				error: validationDetail('Body 必须是一个对象') 
			})
		}
	)
	.listen(3000)

练习

让我们尝试扩展 Elysia 的上下文。

  1. Provide a Custom Validation Message

    Let's override a validation message to be more friendly with your own words

Show answer

我们可以通过向 schema 提供 error 属性来提供一个自定义错误消息。

typescript
import { Elysia, t } from 'elysia'

new Elysia()
	.post(
		'/',
		({ body }) => body,
		{
			body: t.Object({
				age: t.Number({
                    error: '自定义错误'
                })
			})
		}
	)
	.listen(3000)
  • index.ts