美文网首页让前端飞Web前端之路前端开发
Nest.js学习之路(7)-验证DTO属性-Pipe

Nest.js学习之路(7)-验证DTO属性-Pipe

作者: cbw100 | 来源:发表于2019-06-03 15:05 被阅读3次

前面在AppController下建立Platform

  @Post()
  create(@Body() platformDTO: PlatformDTO){
    return `平台:${platformDTO.platformname}已建立`;
  }

从Client传递使用者资料至nest并没有任何验证,client即便输入不符合DTO属性格式,nest也会接受,因为没有写验证的程式码。

假设栏位限制为

  • platformname不能超过十个字元
  • url栏位必须符合url格式

nest.js里有Pipe搭配class-validator、class-transformer套件来实现验证Client栏位输入的信息

流程为

  1. 在PlatformDTO.ts里使用class-validator相关Validation Decorators,例如@IsString()为必须为字串

  2. 建立PlatformDTOValidationPipe实作PipeTransform介面,在transform方法里撰写验证的程式码

  3. 注册至Module底下的providers

  4. 到对应的方法宣告@PlatformPipes并指定PlatformDTOValidationPipe

  5. 测试

  1. 修改PlatformDTO.ts如下
import { IsUrl, IsString, Length } from 'class-validator';

export class PlatformDTO {
    @IsString() 
    @Length(0, 10, { //可以指定错误信息
        message: '长度需要小于十',
    })
    username: string;

    @IsUrl()
    email: string;
}
  1. 建立PlatformDTOValidationPipe.ts
    在src下,新增shared资料夹并新增PlatformDTOValidationPipe.ts如下
import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';

import { plainToClass } from 'class-transformer';
import { validate } from 'class-validator';

@Injectable()
export class PlatformDTOValidationPipe implements PipeTransform<any> {
  async transform(value, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToClass(metatype, value);
    const errors = await validate(object);
    if (errors.length > 0) {
      throw new BadRequestException(errors);
    }
    return value;
  }

  private toValidate(metatype): boolean {
    const types = [String, Boolean, Number, Array, Object];
    return !types.find((type) => metatype === type);
  }
}
  1. 注册至Module底下的providers
    通常Pipe通常放在Shared Module,然后再import到需要的module使用

利用nest cli新增shared.module.ts

nest g module shared
import { Module } from '@nestjs/common';
import { PlatformDTOValidationPipe } from './pipes/platformDTOValidation.pipe';

@Module({
    providers: [
        PlatformDTOValidationPipe,
    ],
})
export class SharedModule {}

将ShardModule import 到 AppModule,让AppModule下的Controller可以使用Shared Module的Pipe

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SharedModule } from './shared/shared.module';

@Module({
  imports: [SharedModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  1. 到对应的方法宣告@UsePipes并指定PlatformDTOValidationPipe
    修改app.controller.ts如下
@Post()
  @UsePipes(PlatformDTOValidationPipe)
  create(@Body() platformDTO: PlatformDTO){
    return `使用者:${platformDTO.platformname}已建立`;
}
  1. 测试
    使用Postman测试结果如下
2018110511.png

username输出超过10个字元,url格式不正确,nest.js回传Error Object,在SPA网页上可以显示验证错误讯息

推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

tuiguang.png

相关文章

网友评论

    本文标题:Nest.js学习之路(7)-验证DTO属性-Pipe

    本文链接:https://www.haomeiwen.com/subject/qqlsxqtx.html