当您从服务器上接收用户的数据时,必须对其进行验证。通过验证,我们的意思是接收数据的形状必须与预期形状相匹配。这很重要,因为您不能信任用户输入。
不要使用泛型作为验证。为“readBody”等实用程序提供接口不是验证。您必须在使用数据之前验证数据。
验证实用程序
h3 提供了一些实用程序来帮助您处理数据验证。您将能够验证:
- 使用
getValidatedQuery
进行查询 - 使用
getValidatedRouterParams
进行参数验证。 - 使用
readValidatedBody
进行主体验证
要验证数据,您可以使用任何您想要的验证库。 h3 不提供任何验证库,如 Zod、joi 或 myzod。
h3 与运行时无关。这意味着您可以在 任何运行时 中使用它。但某些验证库并不与所有运行时兼容。
让我们看看如何使用 Zod 验证数据。
对于以下示例,我们将使用以下模式:
import { z } from 'zod'
const userSchema = z.object({
name: z.string().min(3).max(20),
age: z.number({ coerce: true }).positive().int(),
})
验证查询
您可以使用 getValidatedQuery
来验证查询并获取结果,作为 getQuery
的替代:
import { defineEventHandler, getValidatedQuery } from 'h3'
app.use(
defineEventHandler(async (event) => {
const query = await getValidatedQuery(event, userSchema.parse)
return `Hello ${query.name}! You are ${query.age} years old.`
}),
)
您可以使用 safeParse
而不是 parse
来获取部分查询对象,这样如果查询无效,就不会抛出错误。
如果您向此事件处理程序发送有效请求(如 /?name=John&age=42
),您将收到如下响应:
Hello John!您今年 42 岁。
如果您发送无效请求并且验证失败,h3 将抛出 400 Validation Error
错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。
验证参数
您可以使用 getValidatedRouterParams
来验证参数并获取结果,以替代 getRouterParams
:
import { defineEventHandler, getValidatedRouterParams } from 'h3'
router.use(
// You must use a router to use params
'/hello/:name/:age',
defineEventHandler(async (event) => {
const params = await getValidatedRouterParams(event, userSchema.parse)
return `Hello ${params.name}! You are ${params.age} years old!`
}),
)
您可以使用 safeParse
而不是 parse
来获取部分 params 对象,这样如果 params 无效,就不会抛出错误。
如果您向此事件处理程序发送有效请求(如 /hello/John/42
),您将收到如下响应:
Hello John!您 42 岁了。
如果您发送无效请求并且验证失败,h3 将抛出 400 Validation Error
错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。
验证正文
您可以使用 readValidatedBody
来验证正文并获取结果,以替代 readBody
:
import { defineEventHandler, readValidatedBody } from 'h3'
app.use(
defineEventHandler(async (event) => {
const body = await readValidatedBody(event, userSchema.parse)
return `Hello ${body.name}! You are ${body.age} years old.`
}),
)
您可以使用 safeParse
而不是 parse
来获取部分主体对象,这样如果主体无效,就不会抛出错误。
如果您向此事件处理程序发送有效的 POST 请求,您将获得如下响应:
Hello John!您今年 42 岁。
如果您发送无效请求并且验证失败,h3 将抛出 400 验证错误
错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。