一、关于 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 ‘管道页面’ } }
<a name="hvYaf"></a>### 三、NestJS 中管道结合 Joi 库实现数据验证- 对象结构验证,既然可以修改数据,当然也可以验证数据```typescript// 1.定义 news 管道import { ArgumentMetadata, Injectable, PipeTransform, BadRequestException } from '@nestjs/common';import { ObjectSchema } from '@hapi/joi'; // 引入 joi 库进行数据验证@Injectable()export class NewsPipe implements PipeTransform {// 接收 NewsPipe 实例后传递过来的 schemaconstructor(private schema: ObjectSchema) { }transform(value: any, metadata: ArgumentMetadata) {const { error } = this.schema.validate(value); // 使用 joi 中的 validate 方法进行验证if (error) { // 有错误抛出// throw new BadRequestException('验证失败');return { "success": false };}return value; // 没有错误返回原来的数据}}// 2.控制器中使用管道import { Controller, Get, Query, UsePipes } from '@nestjs/common';import { NewsPipe } from 'src/pipe/news.pipe'; // 引入新闻管道import * as Joi from '@hapi/joi';// 定义新闻Schema进行数据验证let newsSchema = Joi.object().keys({name: Joi.string().required(), // 字符串类型,必填age: Joi.number().integer().min(6).max(66).required(), // 数字类型})@Controller('pipes')export class PipesController {@Get()@UsePipes(new NewsPipe(newsSchema)) // 创建一个管道实例,并将其传递给 Joi 验证index(@Query() query) {console.log(query)return '管道页面'}}
