管道pipes
是什么
管道(pipes)是一种有效的方式来处理输入数据的验证和转换
方式一
需要使用到两个库
npm install class-validator class-transformer -S -D
在项目中新建pipe文件,如login.pipe.ts
import {
ArgumentMetadata,
HttpException,
HttpStatus,
Injectable,
PipeTransform,
} from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
@Injectable()
export class LoginPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
const DTO = metadata.metatype;
const instance = plainToInstance(DTO, value);
const error = await validate(instance);
if (error.length) {
throw new HttpException(error, HttpStatus.BAD_REQUEST);
}
return value;
}
}
ArgumentMetadata
:用于在管道中访问关于转换过程的元数据。HttpException
:NestJS 中的异常类,用于在管道中抛出 HTTP 异常。HttpStatus
:定义了 HTTP 状态码的枚举。Injectable
:用于标记类作为 NestJS 中的可注入服务。PipeTransform
:定义了管道类需要实现的接口。plainToInstance
:来自 class-transformer 库,用于将普通对象转换为类实例。validate
:来自 class-validator 库,用于验证类实例的数据。
然后定义一个管道类LoginPipe
并实现PipeTransform
接口
我们需要在类中实现transform
方法,这个方法主要作用只对值进行转换,value
为通过结果传入的数据,metadata
为我们创建的DTO的元数据
接下来使用plainToInstance
实例化并接受返回的实例,使用 class-validator 进行验证,返回验证错误的数组,如果数据长度不为空的话则验证失败,返回的结构如下
使用throw new HttpException
抛出 HTTP 异常,其中包含验证错误信息,这里抛出的异常可以使用之前的文章里写过的错误拦截器去拦截然后返回给用户
dto文件如下
注册管道验证
直接在需要验证的接口中传入即可
方式二使用NestJs自带的ValidationPipe
验证
import { ValidationPipe } from '@nestjs/common';
第二种方法写起来比较简单,推荐使用第二种方法,验证不通过返回的错误同样可以使用错误拦截器去拦截