log
码中赤兔

Nuxt3 最佳实践02: Request 请求体验证

发布于 2025年1月31日
更新于 2025年2月2日
9 分钟阅读
Vue

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)。

这些方法可以与 zodjoi 以及 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 提供了 readValidatedBodygetValidatedQuerygetValidatedRouterParams 方法,使得后端数据验证变得更加简洁高效。配合 zod 这样的 Schema 校验库,我们可以确保 API 接收到的数据符合预期,避免无效数据的传递,提高应用的健壮性。

在实际开发中,可以根据具体需求选择适合的验证方式,为 API 添加更加严格的数据校验逻辑,提升应用的安全性和稳定性。

希望本文能帮助你更好地理解 Nuxt 3 中的请求数据验证!🎯


上一篇文章:Nuxt3 最佳实践01: 日志输出

下一篇文章:Nuxt3 最佳实践03: OpenAPI 文档输出

关于

分享技术见解、经验和思考的个人博客

联系方式

  • Email: hushukang_blog@proton.me
  • GitHub

© 2025 码中赤兔. 版权所有