一、关于 NestJS 中的管道

  • https://docs.nestjs.cn/8/pipes
  • 通俗的讲:Nestjs中的管道可以将输入数据转换为所需的输出。此外,它也可以处理验证,当数据不正确时可能会抛出异常

    二、NestJS 中创建和使用管道

    ```typescript // 1.安装依赖 npm install —save @hapi/joi npm install —save-dev @types/hapi__joi

// 2.创建管道 nest g pipe pipe/news

// 3.生成代码 import { ArgumentMetadata, Injectable, PipeTransform } from ‘@nestjs/common’;

@Injectable() export class NewsPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { console.log(value) // value 是 get 或 post 传过来的值 console.log(‘———-我是管道———‘) value.id = ‘666666’; // 修改 get 或 post 传过来的值 return value; } }

// 4.使用管道 import { Controller, Get, Query, UsePipes } from ‘@nestjs/common’; import { NewsPipe } from ‘src/pipe/news.pipe’; // 引入新闻管道

@Controller(‘pipes’) export class PipesController { @Get() @UsePipes(new NewsPipe()) // 创建一个管道实例,并将其传递给 Joi 验证 index(@Query() query) { console.log(query) return ‘管道页面’ } }

  1. <a name="hvYaf"></a>
  2. ### 三、NestJS 中管道结合 Joi 库实现数据验证
  3. - 对象结构验证,既然可以修改数据,当然也可以验证数据
  4. ```typescript
  5. // 1.定义 news 管道
  6. import { ArgumentMetadata, Injectable, PipeTransform, BadRequestException } from '@nestjs/common';
  7. import { ObjectSchema } from '@hapi/joi'; // 引入 joi 库进行数据验证
  8. @Injectable()
  9. export class NewsPipe implements PipeTransform {
  10. // 接收 NewsPipe 实例后传递过来的 schema
  11. constructor(private schema: ObjectSchema) { }
  12. transform(value: any, metadata: ArgumentMetadata) {
  13. const { error } = this.schema.validate(value); // 使用 joi 中的 validate 方法进行验证
  14. if (error) { // 有错误抛出
  15. // throw new BadRequestException('验证失败');
  16. return { "success": false };
  17. }
  18. return value; // 没有错误返回原来的数据
  19. }
  20. }
  21. // 2.控制器中使用管道
  22. import { Controller, Get, Query, UsePipes } from '@nestjs/common';
  23. import { NewsPipe } from 'src/pipe/news.pipe'; // 引入新闻管道
  24. import * as Joi from '@hapi/joi';
  25. // 定义新闻Schema进行数据验证
  26. let newsSchema = Joi.object().keys({
  27. name: Joi.string().required(), // 字符串类型,必填
  28. age: Joi.number().integer().min(6).max(66).required(), // 数字类型
  29. })
  30. @Controller('pipes')
  31. export class PipesController {
  32. @Get()
  33. @UsePipes(new NewsPipe(newsSchema)) // 创建一个管道实例,并将其传递给 Joi 验证
  34. index(@Query() query) {
  35. console.log(query)
  36. return '管道页面'
  37. }
  38. }