验证数据 Validate Data

在处理数据之前,请确保数据有效且安全。

当您从服务器上接收用户的数据时,必须对其进行验证。通过验证,我们的意思是接收数据的形状必须与预期形状相匹配。这很重要,因为您不能信任用户输入。

不要使用泛型作为验证。为“readBody”等实用程序提供接口不是验证。您必须在使用数据之前验证数据。

验证实用程序

h3 提供了一些实用程序来帮助您处理数据验证。您将能够验证:

  • 使用getValidatedQuery进行查询
  • 使用getValidatedRouterParams进行参数验证。
  • 使用readValidatedBody进行主体验证

要验证数据,您可以使用任何您想要的验证库。 h3 不提供任何验证库,如 Zodjoimyzod

h3 与运行时无关。这意味着您可以在 任何运行时 中使用它。但某些验证库并不与所有运行时兼容。

让我们看看如何使用 Zod 验证数据。

对于以下示例,我们将使用以下模式:

js
import { z } from 'zod'

const userSchema = z.object({
  name: z.string().min(3).max(20),
  age: z.number({ coerce: true }).positive().int(),
})

验证查询

您可以使用 getValidatedQuery 来验证查询并获取结果,作为 getQuery 的替代:

js
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),您将收到如下响应:

txt
Hello John!您今年 42 岁。

如果您发送无效请求并且验证失败,h3 将抛出 400 Validation Error 错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。

验证参数

您可以使用 getValidatedRouterParams 来验证参数并获取结果,以替代 getRouterParams

js
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),您将收到如下响应:

txt
Hello John!您 42 岁了。

如果您发送无效请求并且验证失败,h3 将抛出 400 Validation Error 错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。

验证正文

您可以使用 readValidatedBody 来验证正文并获取结果,以替代 readBody

js
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 请求,您将获得如下响应:

txt
Hello John!您今年 42 岁。

如果您发送无效请求并且验证失败,h3 将抛出 400 验证错误 错误。在错误数据中,您将找到可以在客户端上使用的验证错误,以便向用户显示一条友好的错误消息。