Nodejs Nestjs数据验证插件zod的使用

Nodejs Nestjs数据验证插件zod的使用
NestJS 是一个用于构建高效、可扩展的服务器端应用程序的框架,而 Zod 是一个强大的 TypeScript-first schema declaration library。将 Zod 与 NestJS 结合使用可以提供一种类型安全的方式来验证请求数据。

下面是如何在 NestJS 应用中使用 Zod 进行数据验证的步骤:

安装依赖

首先,你需要安装 NestJS 和 Zod 相关的库:

npm install @nestjs/common @nestjs/core zod

创建 Zod Schema

假设你有一个用户注册的 API,需要验证用户名和密码字段。你可以创建一个 Zod schema 来定义这些字段的验证规则:

import { z } from 'zod';

export const UserRegistrationSchema = z.object({
  username: z.string().min(3, 'Username must be at least 3 characters long.'),
  password: z.string().min(6, 'Password must be at least 6 characters long.')
});

使用 Zod 在控制器中进行验证

接下来,在你的 NestJS 控制器中使用这个 schema 来验证传入的数据。你可以自定义一个装饰器来简化这个过程。

创建自定义装饰器

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { ZodType } from 'zod';

export function ZodValidationPipe(schema: ZodType<any>) {
  return (req, _metadata?: unknown) => {
    const validatedData = schema.safeParse(req.body);
    if (!validatedData.success) {
      throw new HttpException(validatedData.error.format(), HttpStatus.BAD_REQUEST);
    }
    return validatedData.data;
  };
}

export const Zod = createParamDecorator(
  (schema: ZodType<any>, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return ZodValidationPipe(schema)(request, null);
  },
);

使用装饰器

现在可以在控制器中使用 @Zod 装饰器来应用验证逻辑:

import { Controller, Post, Body } from '@nestjs/common';
import { HttpException, HttpStatus } from '@nestjs/common';
import { Zod } from './utils/zod.decorator'; // 假设你把上面的装饰器放在 utils 文件夹下的 zod.decorator.ts 中
import { UserRegistrationSchema } from './schemas/user-registration.schema';

@Controller('auth')
export class AuthController {
  @Post('register')
  register(@Zod(UserRegistrationSchema) userDto: any) {
    // 这里 userDto 已经被验证过
    console.log(userDto);
    // 处理注册逻辑
  }
}

这样,每当 /auth/register 被调用时,传入的 JSON 数据都会根据 UserRegistrationSchema 进行验证。如果数据不符合要求,会抛出一个包含错误信息的 HTTP 异常。


3 回复

当然,NestJS搭配Zod进行数据验证是个不错的选择!首先,你需要安装Zod和相关的NestJS模块。试试这个命令:

npm install zod @nestjs/common @nestjs/core

接着,在你的服务或控制器中引入并配置Zod。这里有个小例子:

import { z } from 'zod';

const userSchema = z.object({
  name: z.string(),
  age: z.number().min(1),
});

export class UserController {
  createUser(user: any) {
    const result = userSchema.safeParse(user);
    if (!result.success) {
      throw new Error('Invalid user data');
    }
    // 处理用户逻辑...
  }
}

这样,每次调用createUser时,都会自动检查user对象是否符合userSchema定义的结构。如果不符合,就会抛出错误。希望这能让你的代码既安全又好笑!


Zod 是一个 TypeScript-first 的模式验证库,可以非常方便地与 NestJS 一起使用来处理数据验证。以下是如何在 NestJS 项目中使用 Zod 进行数据验证的步骤。

步骤1:安装必要的依赖

首先,确保你的项目已经安装了 @nestjs/common, @nestjs/mapped-typeszod。你可以通过 npm 安装这些包:

npm install @nestjs/common @nestjs/mapped-types zod

如果你希望在控制器层进行验证,可能还需要安装 class-transformerclass-validator 来支持一些标准的装饰器(虽然这不是必须的):

npm install class-transformer class-validator

步骤2:定义 Zod 模式

创建一个 Zod 模式文件来定义你想要验证的数据结构。例如,创建一个 schemas 文件夹,并在其中创建一个名为 user.schema.ts 的文件:

// src/schemas/user.schema.ts
import { z } from 'zod';

const userSchema = z.object({
  id: z.string(),
  name: z.string().min(3, "Name must be at least 3 characters"),
  email: z.string().email("Invalid email format")
});

export type UserInputDTO = z.infer<typeof userSchema>;
export const validateUserInput = (input: Record<string, any>): UserInputDTO => {
  return userSchema.parse(input);
};

步骤3:创建服务或中间件

你可以选择在服务或中间件中使用 Zod 来验证数据。这里我展示如何在服务中进行验证:

// src/users.service.ts
import { Injectable } from '@nestjs/common';
import { validateUserInput } from '../schemas/user.schema';

@Injectable()
export class UsersService {
  async createUser(input: Record<string, any>) {
    const validatedData = validateUserInput(input);
    // 使用 validatedData 创建用户
    console.log(validatedData);
    // 返回创建的用户
    return validatedData;
  }
}

步骤4:在控制器中使用服务

最后,在你的控制器中调用这个服务的方法:

// src/users.controller.ts
import { Controller, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  async create(@Body() body: Record<string, any>) {
    return this.usersService.createUser(body);
  }
}

小结

以上就是如何在 NestJS 项目中使用 Zod 进行数据验证的基本步骤。这种方式不仅简洁而且类型安全,非常适合现代 TypeScript 应用程序。

Zod 是一个强大的 TypeScript 数据验证库,可以与 NestJS 结合使用以增强数据验证能力。首先安装 Zod:

npm install zod

然后创建一个 Zod schema 来定义你的数据结构。例如:

import { z } from 'zod';

const userSchema = z.object({
  name: z.string(),
  age: z.number().min(0),
});

在 NestJS 中,你可以通过自定义管道来应用这个 schema 进行验证:

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
import { z } from 'zod';

@Injectable()
export class ZodValidationPipe implements PipeTransform {
  constructor(private readonly schema: z.ZodTypeAny) {}

  transform(value: any, metadata: ArgumentMetadata) {
    const parsedValue = this.schema.parse(value);
    return parsedValue;
  }
}

最后,在控制器中应用这个管道:

@Post()
async createUser(@Body(new ZodValidationPipe(userSchema)) body: any) {
  // 处理逻辑
}

这样就可以在 NestJS 中使用 Zod 进行数据验证了。

回到顶部