Nuxt3 最佳实践02: Request 请求体验证
1. 简介
在 Nuxt 3 中,服务器端引擎使用的是 Nitro,而 Nitro 采用的是 H3 框架。H3 提供了一些便捷的方法用于验证请求体(Request Body)、查询参数(Query String Parameters)以及路径参数(Path Parameters)。
H3 提供的核心验证方法包括:
readValidatedBody:用于验证请求体(Request Body)。getValidatedQuery:用于验证查询参数(Query String Parameters)。getValidatedRouterParams:用于验证路径参数(Path Parameters)。
这些方法可以与 zod、joi 以及 myzod 等常见的 Schema 验证库配合使用。本文将重点介绍如何结合 zod 进行数据验证。
安装 zod
在开始之前,我们需要安装 zod 依赖包:
npm install zod
2. 具体用法
2.1 请求体(Request Body)验证
当前端发送 POST 请求时,我们通常需要对请求体的数据进行格式校验。例如,我们希望 username 至少包含 3 个字符,password 至少包含 6 个字符。这时可以使用 readValidatedBody 进行验证:
import { readValidatedBody } from 'h3';
import z from 'zod';
const userSchema = z.object({
username: z.string().min(3, '用户名至少 3 个字符'),
password: z.string().min(6, '密码至少 6 个字符'),
});
export default defineEventHandler(async (event) => {
const body = await readValidatedBody(event, userSchema.parse);
console.log(body);
return {
message: '数据验证成功!',
};
});
如果请求体的数据不符合 zod 设定的 Schema,Nuxt 将会返回 400 Bad Request 错误。
2.2 查询参数(Query String Parameters)验证
在 GET 请求中,查询参数是常见的数据传递方式。我们可以使用 getValidatedQuery 进行验证。例如,我们希望 username 是一个可选的字符串:
import { getValidatedQuery } from 'h3';
import z from 'zod';
const querySchema = z.object({
username: z.string().optional(),
});
export default defineEventHandler(async (event) => {
const query = await getValidatedQuery(event, querySchema.parse);
console.log(query);
return {
message: '查询参数验证成功!',
};
});
如果 username 传递了错误的类型(例如一个数组或数字),Nuxt 也会返回 400 Bad Request。
2.3 路径参数(Path Parameters)验证
在 RESTful API 设计中,路径参数通常用于标识资源。例如,在 /user/:id 这种 URL 结构中,我们可以使用 getValidatedRouterParams 验证 id 是否为合法的 UUID:
import { getValidatedRouterParams } from 'h3';
import z from 'zod';
const paramSchema = z.object({
id: z.string().uuid(),
});
export default defineEventHandler(async (event) => {
const params = await getValidatedRouterParams(event, paramSchema.parse);
console.log(params);
return {
message: `用户 ID ${params.id} 验证成功!`,
};
});
如果 id 不是有效的 UUID,Nuxt 将会返回 400 Bad Request。
3. 总结
Nuxt 3 结合 H3 提供了 readValidatedBody、getValidatedQuery 和 getValidatedRouterParams 方法,使得后端数据验证变得更加简洁高效。配合 zod 这样的 Schema 校验库,我们可以确保 API 接收到的数据符合预期,避免无效数据的传递,提高应用的健壮性。
在实际开发中,可以根据具体需求选择适合的验证方式,为 API 添加更加严格的数据校验逻辑,提升应用的安全性和稳定性。
希望本文能帮助你更好地理解 Nuxt 3 中的请求数据验证!🎯
上一篇文章:Nuxt3 最佳实践01: 日志输出