nest自定义验证类及自定义验证装饰器

本文介绍了如何在NestJS项目中使用class-validator进行自定义验证,通过创建管道和DTO,实现了密码确认和唯一性验证。文章以注册模块为例,详细讲解了创建自定义验证规则的步骤,包括创建管道、定义DTO和装饰器,以及利用Prisma进行数据库查询验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书接上回,我们在class-validator发现了许多优秀的验证规则,但是在我们实际开发需求中,有很多地方需要验证,但是包缺少了,这个时候只能我们自己去写了,我们也是根据这个包的文档去实现自定义验证。

 

自定义验证类

这次我们以常见的注册模块中的两次密码验证为例带领大家来实现一下。

首先创建一个post请求用于表单提交的验证,并使用管道,管道在上一篇有提到过,相信看到这里的小伙伴都了解管道了,不多说,管道代码给大家贴出

import { ArgumentMetadata, BadRequestException, HttpException, HttpStatus, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer'
import { validate } from 'class-validator';
@Injectable()
export class MengPipe implements PipeTransform {
  async transform(value: any, metadata: ArgumentMetadata) {
    const object = plainToInstance(metadata.metatype, value)
    const errors = await validate(object)
    if (errors.length) {
      const messages = errors.map(error => ({
        name: error.property,
        message: Object.values(error.constraints).map(v => v)
      }))
      throw new HttpException(messages, HttpStatus.BAD_REQUEST)
    }
    return value
  }

}

 接着在dto文件夹下面创建一个验证密码的文件,这两个都是class-validator给我们提供的可以直接用,上篇文章都有讲

 接着在github找到这个地方

 

 将代码复制下来后,接着创建一个rules文件夹存放自定义验证规则 

 我们在使用的时候其实就是向外暴露了validate这个函数,下面的defaultMessage是返回我们的报错信息的,所以结构还是比较简单的,具体可以看官方文档,很清晰。

我们对代码来简单调整一下

装饰器里面的用不到,先给他拿走, 来看看text以及args里面是啥东西

 先把这个服务类在dto里面注册一下,让它明确我们要验证的是密码

 

 

 

 这里返回的是错误不用管,因为我们validate返回的是fasle

text就是我们要验证的字段的数值

args可以拿到很多属性,这样我们就可以做验证了

 

  当我们输入正确时可以成功返回,不正确时也能够捕捉错误

但是我们的写法有点low,来优化一下

 这样,如果有很多需要验证的我们都可以用这一个验证类,达到复用的效果。

自定义验证装饰器

我们来用唯一字段验证这个例子带领大家掌握这个的用法

 我们在rules下创建一个is_not_exist.ts文件

这个类型报错可以这样解决 

把这个装饰器给引入一下

 我们发现需要传入1~2个参数 property validationOptions ,也就是下面这里要传的参数

我们先在mysql中创建一条表数据

 我们这里就以的添加表字段为例,实现一下验证装饰器的用法

我们以prisma实例来写一个查表的方法 这里要注意异步处理。

 我们用的是是user这张表,所以传的property是'user'

 当我们发起一个携带同样的username的post请求时 发现已经成功实现  ,正常请求也是没有问题

写在最后

nest有很多值得我们去探索的东西,我总结的都是在开发中大概率会用到的,希望能帮助到大家!

### 回答1: 一个示例的nestjs服务的自定义传输器可以如下: const { Injectable, HttpService } = require('@nestjs/common');@Injectable() export class MyCustomTransport { constructor(private httpService: HttpService) { } async send(data: any) { const response = await this.httpService.post('url', data); return response.data; } } ### 回答2: 在 NestJS 中使用自定义传输器(transport)的例子如下: 首先,我们需要定义一个自定义传输器。假设我们的传输器名称为 CustomTransporter,可以创建一个 custom-transporter.ts 文件,并在其中定义如下的: ```typescript import { Server, CustomTransportStrategy } from 'nestjs'; export class CustomTransporter implements CustomTransportStrategy { private server: Server; listen(callback: () => void) { // 实现你的自定义传输器逻辑,例如创建 WebSocket 服务器或者其他自定义的传输层 // 在这个例子中,我们简单打印信息以演示功能 console.log('Custom transporter listening...'); callback(); } close() { // 实现关闭传输器的逻辑 // 在这个例子中,我们简单打印信息以演示功能 console.log('Closing custom transporter...'); } } ``` 然后,在 NestJS 中使用自定义传输器,可以在应用模块中进行配置。假设我们的应用模块名称为 AppModule,可以在 app.module.ts 文件中进行如下配置: ```typescript import { Module } from '@nestjs/common'; import { CustomTransporter } from './custom-transporter'; @Module({ imports: [], controllers: [], providers: [ { provide: 'CUSTOM_TRANSPORTER', // 自定义传输器的标记,用于依赖注入 useClass: CustomTransporter, // 使用我们上面定义的自定义传输器 }, ], }) export class AppModule {} ``` 最后,在 NestJS 服务中使用自定义传输器,可以在服务的构造函数中注入传输器,并使用其方法。假设我们有一个自定义服务 CustomService,可以在 custom.service.ts 文件中进行如下配置: ```typescript import { Injectable, Inject } from '@nestjs/common'; @Injectable() export class CustomService { constructor( @Inject('CUSTOM_TRANSPORTER') private readonly transporter: any, ) {} start() { this.transporter.listen(() => { console.log('Custom service started!'); }); } stop() { this.transporter.close(); console.log('Custom service stopped!'); } } ``` 在上面的例子中,创建了一个 CustomService 服务,并在构造函数中使用自定义传输器。在 start 方法中,调用传输器的 listen 方法以启动传输器,并在 stop 方法中调用传输器的 close 方法以停止传输器。 以上就是使用自定义传输器的 NestJS 服务的例子,这个例子展示了如何创建自定义传输器并将其用于服务中。 ### 回答3: NestJS是一个基于Node.js的现代化框架,它提供了一种简单且方便的方式来构建高效可扩展的服务器端应用程序。 在NestJS中,我们可以通过自定义传输器来处理进出服务的数据。传输器是NestJS中用于接收和发送数据的实体,它们负责对数据进行验证和转换。 下面是一个自定义传输器的例子,我们将创建一个名为"UserDTO"的传输器,用于在用户注册时接收和发送用户数据: ```typescript import { IsEmail, IsString } from 'class-validator'; export class UserDTO { @IsString() readonly username: string; @IsEmail() readonly email: string; @IsString() readonly password: string; } ``` 在上面的代码中,我们使用了class-validator库来验证接收到的数据,确保它们符合指定的规则(例如,username必须是字符串,email必须是有效的电子邮件地址等)。 接下来,让我们在一个名为"UserService"的服务中使用自定义传输器: ```typescript import { Injectable } from '@nestjs/common'; import { UserDTO } from './user.dto'; @Injectable() export class UserService { async registerUser(userDTO: UserDTO): Promise<string> { // 在这里处理用户注册的逻辑 // ... return '用户注册成功'; } } ``` 在上面的代码中,我们在一个名为"registerUser"的方法中接收了一个名为"userDTO"的UserDTO对象,该对象包含了用户的相关信息。我们可以在这个方法中处理用户注册的逻辑,并返回一个表示注册成功的消息。 现在,我们可以在其他地方使用UserService来处理用户注册请求: ```typescript import { Controller, Post, Body } from '@nestjs/common'; import { UserService } from './user.service'; import { UserDTO } from './user.dto'; @Controller('users') export class UserController { constructor(private readonly userService: UserService) {} @Post('register') async registerUser(@Body() userDTO: UserDTO): Promise<string> { return this.userService.registerUser(userDTO); } } ``` 在上面的代码中,我们使用了NestJS的@Controller和@Post装饰器来创建一个名为"UserController"的控制器,并在其中使用了"registerUser"方法来处理用户注册请求。 以上就是一个使用NestJS中的自定义传输器的示例,它展示了如何在服务中接收和发送数据,并使用class-validator库来进行验证。希望这个例子可以帮助您理解NestJS自定义传输器的用法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值