一、关于 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 实例后传递过来的 schema
constructor(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 '管道页面'
}
}