前面在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栏位输入的信息
流程为
在PlatformDTO.ts里使用class-validator相关Validation Decorators,例如@IsString()为必须为字串
建立PlatformDTOValidationPipe实作PipeTransform介面,在transform方法里撰写验证的程式码
注册至Module底下的providers
到对应的方法宣告@PlatformPipes并指定PlatformDTOValidationPipe
测试
- 修改PlatformDTO.ts如下
import { IsUrl, IsString, Length } from 'class-validator';
export class PlatformDTO {
@IsString()
@Length(0, 10, { //可以指定错误信息
message: '长度需要小于十',
})
username: string;
@IsUrl()
email: string;
}
- 建立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);
}
}
- 注册至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 {}
- 到对应的方法宣告@UsePipes并指定PlatformDTOValidationPipe
修改app.controller.ts如下
@Post()
@UsePipes(PlatformDTOValidationPipe)
create(@Body() platformDTO: PlatformDTO){
return `使用者:${platformDTO.platformname}已建立`;
}
- 测试
使用Postman测试结果如下
username输出超过10个字元,url格式不正确,nest.js回传Error Object,在SPA网页上可以显示验证错误讯息
推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。