参数校验
我们经常要在方法调用时执行一些类型检查,参数转换的操作,Midway 提供了一种简单的能力来快速检查参数的类型。
提示
从 v4.0.0 起,@midwayjs/validation 作为 @midwayjs/validate 的升级替代方案推出,两者是不同的包。
@midwayjs/validation 提供更上层的校验抽象,支持 joi/zod/class-validator,并预留自定义校验器扩展;@midwayjs/validate 仅基于 joi,仍可用但不再新增功能,建议逐步迁移。
新版本提供了更灵活的验证器扩展机制,支持多种验证器(如 Joi、Zod 等)的无缝切换,并提供了更好的类型支持和性能优化。
相关信息:
| 描述 | |
|---|---|
| 可用于标准项目 | ✅ |
| 可用于 Serverless | ✅ |
| 可用于一体化 | ✅ |
| 包含独立主框架 | ❌ |
| 包含独立日志 | ❌ |
背景
最常用参数校验的地方是控制器(Controller),同时你也可以在任意的 Class 中使用这个能力。
我们以控制器(Controller)中使用为例。
➜ my_midway_app tree
.
├── src
│ ├── controller
│ │ └── user.ts
│ ├── interface.ts
│ └── service
│ └── user.ts
├── test
├── package.json
└── tsconfig.json
普通情况下,我们从 body 上拿到所有 Post 结果,并进行一些校验。
// src/interface.ts
export interface User {
id: number;
firstName: string;
lastName: string;
age: number;
}
// src/controller/home.ts
import { Controller, Get, Provide } from '@midwayjs/core';
@Controller('/api/user')
export class HomeController {
@Post('/')
async updateUser(@Body() user: User) {
if (!user.id || typeof user.id !== 'number') {
throw new Error('id error');
}
if (user.age <= 30) {
throw new Error('age not match');
}
// xxx
}
}
如果每个方法都需要这么校验,会非常的繁琐。
针对这种情况,Midway 提供了 Validation 组件。配合 @Validate 和 @Rule 装饰器,用来 快速定义校验的规则,帮助用户 减少这些重复的代码。
下面的通用能力将以 joi 来举例。
安装依赖
你需要安装 validation 组件以及对应验证器。
## 安装 validation 组件
$ npm i @midwayjs/validation@4 --save
## 选择一个或多个验证器
$ npm i @midwayjs/validation-joi@4 --save
## 基础库
$ npm i joi --save
或者在 package.json 中增加如下依赖后,重新安装。
{
"dependencies": {
"@midwayjs/validation": "^4.0.0",
"@midwayjs/validation-joi": "^4.0.0",
"joi": "^17.13.3",
// ...
},
"devDependencies": {
// ...
}
}
开启组件
在 configuration.ts 中增加组件:
import { Configuration, App } from '@midwayjs/core';
import * as koa from '@midwayjs/koa';
import * as validation from '@midwayjs/validation';
import { join } from 'path';
@Configuration({
imports: [
koa,
validation,
// ... 其他组件
],
importConfigs: [join(__dirname, './config')],
})
export class MainConfiguration {
@App()
app: koa.Application;
async onReady() {
// ...
}
}
在配置文件 中设置验证器:
// src/config/config.default.ts
import joi from '@midwayjs/validation-joi';
export default {
// ...
validation: {
// 配置验证器
validators: {
joi,
},
// 设置默认验证器
defaultValidator: 'joi'
}
}