局部管道
创建管道
比如,在模块 demo-student 中创建一个 局部管道: number
,将请求参数转换为number
类型
1. Cli命令
bash
$ vona :create:bean pipe number --module=demo-student
2. 菜单命令
TIP
右键菜单 - [模块路径]: Vona Aspect/Pipe
管道定义
typescript
export type TypePipeNumberData = unknown;
export type TypePipeNumberResult = number;
export interface IPipeOptionsNumber extends IDecoratorPipeOptions {}
@Pipe<IPipeOptionsNumber>()
class PipeNumber {
async transform(value: TypePipeNumberData, _metadata: RouteHandlerArgumentMeta, _options: IPipeOptionsNumber): Promise<TypePipeNumberResult> {
const valueNew = Number(value);
if (Number.isNaN(valueNew)) this.app.throw(400);
return valueNew;
}
}
TypePipeNumberData
: 入参类型TypePipeNumberResult
: 结果类型IPipeOptionsNumber
: 定义管道参数transform
: 对参数进行判断和转换
使用管道
1. 标注控制器方法
diff
import { Aspect } from 'vona-module-a-aspect';
@Controller()
class ControllerStudent {
@Web.get(':id')
+ @Aspect.pipe('demo-student:number')
async findOne(id: number) {}
}
@Aspect.pipe
: 此装饰器用于使用局部管道,只需传入管道的名称- number 管道属于模块
demo-student
,因此完整的名称是demo-student:number
- number 管道属于模块
2. 标注控制器类
可以针对控制器类使用管道,从而类中所有方法都会应用此管道
diff
import { Aspect } from 'vona-module-a-aspect';
@Controller()
+ @Aspect.pipe('demo-student:number')
class ControllerStudent {
@Web.get(':id')
async findOne(id: number) {}
}
管道参数
可以为管道定义参数,通过参数更灵活的配置管道逻辑
比如,为 number 管道定义errorCode
参数,如果传入的请求参数不是 number 类型就抛出异常,错误代码为errorCode
1. 定义参数类型
diff
export interface IPipeOptionsNumber extends IDecoratorPipeOptions {
+ errorCode: number;
}
2. 提供参数缺省值
diff
@Pipe<IPipeOptionsNumber>({
+ errorCode: 400,
})
3. 使用参数
diff
export interface IPipeOptionsNumber extends IDecoratorPipeOptions {
errorCode: number;
}
@Pipe<IPipeOptionsNumber>({
errorCode: 400,
})
export class PipeNumber extends BeanBase implements IPipeTransform<TypePipeNumberData, TypePipeNumberResult> {
async transform(value: TypePipeNumberData, _metadata: RouteHandlerArgumentMeta, options: IPipeOptionsNumber): Promise<TypePipeNumberResult> {
const valueNew = Number(value);
- if (Number.isNaN(valueNew)) this.app.throw(400);
+ if (Number.isNaN(valueNew)) this.app.throw(options.errorCode);
return valueNew;
}
}
4. 使用时指定参数
可以针对某个 API 单独指定局部管道的参数
diff
class ControllerStudent {
@Web.get(':id')
+ @Aspect.pipe('demo-student:number', { errorCode: 500 })
async findOne(id: number) {}
}
- 在使用管道时直接提供参数值即可
5. App config配置
可以在 App config 中配置管道参数
src/backend/config/config/config.ts
typescript
// onions
config.onions = {
pipe: {
'demo-student:number': {
errorCode: 500,
},
},
};
6. 参数优先级
使用时指定参数
> App config配置
> 参数缺省值