简介
参数验证一直都是让后端狗比较蛋疼的事情, 最近在学nestjs, 发现这里边使用管道加Joi验证比较舒适, 记录一下
教程
1. 安装
npm install --save @hapi/joi
npm install --save-dev @types/hapi__joi
2. 创建验证管道类
// JoiValidationPipe.ts
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import Joi = require('@hapi/joi');
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private readonly schema: Joi.Schema) {}
// value 是传进来的值, 从metadata中可以取出 相关类型 Body Query 等
transform(value: any, metadata: ArgumentMetadata) {
const { error } = this.schema.validate(value);
if (error) {
throw new BadRequestException(error.message || 'Validation failed');
}
return value;
}
}
3. 创建需要验证的对象schema, 当然如果是简单的验证某个字段, 也可以不需要定义, 后面会给出示例
// cat.schema.ts
// cat 验证器
import Joi = require('@hapi/joi');
export default Joi.object({
name: Joi.string()
.alphanum()
.min(3)
.max(30)
.required(),
age: Joi.number()
.integer()
.min(1900)
.max(2013)
.required(),
color: Joi.string().required()
});
示例
1. 使用cat.schema.ts 来验证
// app.controller.ts
import { Controller, Get, Post, UsePipes, Body, PipeTransform, Query } from '@nestjs/common';
import Joi = require('@hapi/joi');
import { AppService } from './app.service';
import { JoiValidationPipe } from './valider/JoiValidationPipe';
import CatSchema from './schema/cat.schema';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
// 使用方式一
@Post('cat')
@UsePipes(new JoiValidationPipe(CatSchema)) // 此处会直接把body 或者 query 传到transform 里 也就是value
cat(@Body() body) {}
// 使用方式二 和 方式一 略有区别
@Post('cat1')
cat_1(@Body(new JoiValidationPipe(CatSchema)) body) {} // 此处会直接把 body 传到transform里 也就是value, @Query同理
// 使用方式三 属性验证
@Get('cat2')
cat_2(
@Query(
'age',
// 此处直接使用Joi对象来创建schema 详情可以取Joi官网查看
new JoiValidationPipe(
Joi.number()
.positive() // 正数
.integer() // 整数
.max(100) // 最大100
.required() // 必须
)
)
age
) {} // 此处会直接把 query 传到transform里 也就是value,
}
传送门
总结
至此一个简单的nestjs中使用Joi和pipe进行验证的demo就写好了, 是不是很简单呢 0..0
感谢您的阅读!如果文章中有任何错误,或者您有更好的理解和建议,欢迎和我联系!