验证数据
当您在服务器上接收用户数据时,必须对其进行验证。验证意味着接收到的数据的结构必须符合预期的结构。这很重要,因为您无法信任用户输入。
readJSONBody
这样的工具提供接口并不等同于验证。您必须在使用数据之前对其进行验证。验证辅助工具
h3 提供了一些辅助工具,帮助您处理数据验证。您可以验证:
- 使用
getValidatedQuery
验证查询参数 - 使用
getValidatedRouterParams
验证路由参数 - 使用
readValidatedJSONBody
验证请求体
您可以使用任何您喜欢的验证库来验证数据。h3 本身不提供任何像 Zod、joi 或 myzod 这样的验证库。
下面以 Zod 为例,演示如何验证数据。
在接下来的示例中,我们将使用如下的 schema:
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 { getValidatedQuery } from "h3";
app.use(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! You are 42 years old.
如果您发送一个无效请求且验证失败,h3 会抛出 400 Validation Error
错误。在错误数据中,您会找到验证错误信息,您可以在客户端使用这些信息向用户显示友好的错误消息。
验证路由参数
您可以使用 getValidatedRouterParams
来验证路由参数并获取结果,替代 getRouterParams
:
import { getValidatedRouterParams } from "h3";
router.use(
// 您必须使用路由才能使用参数
"/hello/:name/:age",
async (event) => {
const params = await getValidatedRouterParams(event, userSchema.parse);
return `Hello ${params.name}! You are ${params.age} years old!`;
},
);
safeParse
替代 parse
,以获得部分路由参数对象,并且在参数无效时不会抛出错误。如果您向该事件处理器发送一个有效请求,比如 /hello/John/42
,您将得到如下响应:
Hello John! You are 42 years old.
如果您发送一个无效请求且验证失败,h3 会抛出 400 Validation Error
错误。在错误数据中,您会找到验证错误信息,您可以在客户端使用这些信息向用户显示友好的错误消息。
验证请求体
您可以使用 readValidatedJSONBody
来验证请求体并获取结果,替代 readJSONBody
:
import { readValidatedJSONBody } from "h3";
app.use(async (event) => {
const body = await readValidatedJSONBody(event, userSchema.parse);
return `Hello ${body.name}! You are ${body.age} years old.`;
});
safeParse
替代 parse
,以获得部分请求体对象,并且在请求体无效时不会抛出错误。如果您向该事件处理器发送一个有效的 POST 请求,将得到如下响应:
Hello John! You are 42 years old.
如果您发送一个无效请求且验证失败,h3 会抛出 400 Validation Error
错误。在错误数据中,您会找到验证错误信息,您可以在客户端使用这些信息向用户显示友好的错误消息。