nestjs 全栈进阶--管道

117 阅读3分钟
视频教程

24_nestjs中的管道_哔哩哔哩_bilibili

1. 介绍

在Nest.js框架中,Pipe 是一种用于处理HTTP请求参数的装饰器和类,它是Nest应用中实现输入验证、数据转换和格式化的重要组件之一。当请求到达控制器(Controller)中的某个路由处理器方法时,可以在方法参数上使用@Body()、@Query()、@Param()等装饰器来指定期望获取的请求体、查询参数或路径参数。然后,通过在这些装饰器之上应用自定义的管道(Pipe),可以对这些参数进行预处理。

nest new pipe -p pnpm

2. 内置pipe

2.1. ParseIntPipe

  • ParseIntPipe: 验证是不是整数,如果不是,就尝试转换,不能转换就抛错

可以看到,我们新建了个handle,我们用@Query装饰器,取了age参数,默认是字符串类型

我们可以通过 ParseIntPipe 把它转为整数

如果我们的age参数不能转换时:

当然,你是可以指定报错信息的,你可以只修改code,也可以修改信息好code

2.2. ParseFloatPipe

是把参数转换为 float 类型的,和ParseIntPipe用法一致,不在赘述

2.3. ParseBoolPipe

是把参数转换为 boolean 类型的,和ParseIntPipe用法一致,不在赘述

2.4. ParseArrayPipe

默认会将接收到的字符串类型的数组参数按照逗号分隔解析为字符串数组,但你也可以指定转换的目标类型,使其自动将字符串转换为目标类型数组。

这时会提示需要 class-validator 包(这是一个对 class 属性做验证的库)

我们安装他

pnpm add class-validator

安装完成后,他会接着报错,缺少 class-transformer 这个包(把普通对象转换为对应的 class 实例的包)

我们继续安装他

pnpm add  class-transformer

然后我们访问下

我们拓展一下,我希望他给我们一个数字的数组,并且前端是以 、分割传递的,这时候就需要用 new ParseArrayPipe 的方式传入参数了

当没有参数时,会报错

如果你希望的是可以不传参数

这样就不会报错,并且没有参数时你得到的值是undefined

2.5. ParseEnumPipe

用于将请求参数转换为枚举类型。这对于确保传入的参数值符合预定义的一组枚举值非常有用。

如果参数值不是枚举里的,就会报错

2.6. ParseUUIDPipe

iuuid 是一种随机生成的几乎不可能重复的字符串

我们可以找个uuid的生成网站得到一个:www.lddgo.net/string/uuid

uuid:eed0ffe6-96f0-414b-aba0-fe2a0d99c1cc

如果不是 uuid 会抛异常

2.7. DefaultValuePipe

它是用来设置参数默认值的

比如这个,传了就是你传的值,没传id时,默认值就是123456

2.8. ValidationPipe 和 ParseFilePipe

这两个内容太多,我们单独讲

2.9. 自定义pipe

我们之前讲aop的时候,已经讲过概念了,我们这里就直接实践,我们来是实现一个DefaultValuePipe

nest g pipe aaa --flat --no-spec
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';

function isNil(value: any): boolean {
  return value === null || value === undefined;
}

function isNumber(value: any) {
  return typeof value === 'number';
}

@Injectable()
export class AaaPipe implements PipeTransform {
  constructor(protected readonly defaultValue: any) {}

  transform(value: any, metadata: ArgumentMetadata) {
    if (isNil(value) || (isNumber(value) && isNaN(value))) {
      return this.defaultValue;
    }
    return value;
  }
}