VonaJS: 序列化/数据脱敏(上)

序列化/数据脱敏

VonaJS 提供了序列化能力,可以对 API 的响应数据进行转换,比如:排除密码字段,对 Email 和 Mobile 进行脱敏处理,等等

先介绍通用的序列化机制,再介绍一组工具函数。通过工具函数可以更加便利的使用序列化能力

创建Serializer Transform

比如,在模块 demo-student 中创建一个 Serializer Transform: upper,将字段值转化为大写

1. Cli命令

bash 复制代码
$ vona :create:bean serializerTransform upper --module=demo-student

2. 菜单命令

bash 复制代码
右键菜单 - [模块路径]: `Vona Bean/Serializer Transform`

Serializer Transform定义

typescript 复制代码
export type TypeSerializerTransformUpperValue = string;

export type TypeSerializerTransformUpperData = unknown;

export type TypeSerializerTransformUpperResult = TypeSerializerTransformUpperValue;

export interface ISerializerTransformOptionsUpper extends IDecoratorSerializerTransformOptions {}

@SerializerTransform<ISerializerTransformOptionsUpper>()
export class SerializerTransformUpper extends BeanBase {
  async transform(
    value: TypeSerializerTransformUpperValue,
    _data: TypeSerializerTransformUpperData,
    _options: ISerializerTransformOptionsUpper,
  ): Promise<TypeSerializerTransformUpperResult> {
    return value.toUpperCase();
  }
}
  • TypeSerializerTransformUpperValue: 定义字段类型
  • TypeSerializerTransformUpperData: 定义外层 object 对象类型
  • TypeSerializerTransformUpperResult: 定义结果类型
  • transform: 将字段值转为大写

使用Serializer Transform

比如学生 APIfindOne方法返回的结果类型是EntityStudent。下面将EntityStudentname字段转为大写

1. 开启序列化

需要为 API 开启序列化

diff 复制代码
class ControllerStudent {
  @Web.get(':id')
  @Api.body(v.optional(), v.object(EntityStudent))
+ @Serializer.enable()
  async findOne(id) {
    return await this.scope.service.student.findOne(id);
  }
}
  • @Serializer.enable: 开启序列化

2. 设置字段

diff 复制代码
class EntityStudent {
+ @Serializer.transform('demo-student:upper')
  @Api.field(v.title($locale('Name')), v.default(''), v.min(3))
  name: string;
}
  • @Serializer.transform: 传入 Serializer Transform 名称demo-student:upper

Filter参数

可以为 Serializer Transform 传入 Filter 参数。系统先执行 Filter 函数,根据结果来控制当前 Serializer Transform 是否需要执行

比如,如果当前用户名是admin则不执行upper的转换逻辑

diff 复制代码
class EntityStudent {
  @Serializer.transform('demo-student:upper', {
+   filter(this: VonaContext) {
+     return this.user.name !== 'admin';
+   },
  })
  @Api.field(v.title($locale('Name')), v.default(''), v.min(3))
  name: string;
}

Serializer Transform参数

可以为 Serializer Transform 定义参数,通过参数更灵活的配置转换逻辑

比如,为 Serializer Transform upper定义first参数,用于控制是否只将首字母转为大写

1. 定义参数类型

diff 复制代码
export interface ISerializerTransformOptionsUpper extends IDecoratorSerializerTransformOptions {
+ first?: boolean;
}

2. 提供参数缺省值

diff 复制代码
@SerializerTransform<ISerializerTransformOptionsUpper>({
+ first: false,
})

3. 使用参数

diff 复制代码
export interface ISerializerTransformOptionsUpper extends IDecoratorSerializerTransformOptions {
  first?: boolean;
}

@SerializerTransform<ISerializerTransformOptionsUpper>({
  first: false,
})
class SerializerTransformUpper {
  async transform(
    value: TypeSerializerTransformUpperValue,
    _data: TypeSerializerTransformUpperData,
    options: ISerializerTransformOptionsUpper,
  ): Promise<TypeSerializerTransformUpperResult> {
-   return value.toUpperCase();
+   return options.first ? toUpperCaseFirstChar(value) : value.toUpperCase();
  }
}

4. 使用时指定参数

可以指定@Serializer.transform的参数

diff 复制代码
class EntityStudent {
+ @Serializer.transform('demo-student:upper', { first: true })
  @Api.field(v.title($locale('Name')), v.default(''), v.min(3))
  name: string;
}

5. App Config配置

可以在 App Config 中配置 Serializer Transform 参数

src/backend/config/config/config.ts

typescript 复制代码
// onions
config.onions = {
  serializerTransform: {
    'demo-student:upper': {
      first: true,
    },
  },
};

6. 参数优先级

使用时指定参数 > App Config配置 > 参数缺省值

资源

相关推荐
大貔貅喝啤酒12 小时前
接口测试_Postman(详细版)
javascript·测试工具·node.js·自动化·postman
桜吹雪13 小时前
Langchain.js官方文档:构建具备按需加载技能的 SQL 助手
javascript·人工智能·node.js
Restart-AHTCM15 小时前
AI 时代的大前端崛起,TypeScript 重塑前端开发
前端·人工智能·typescript·ai编程·a
一袋米扛几楼9815 小时前
【报错问题】解决 Vercel 部署报错:Express 类型失效与 TypeScript 2349/2339/2769 错误排查
ubuntu·typescript·express
一袋米扛几楼9818 小时前
【报错问题】彻底解决 TypeScript 报错 TS2769: No overload matches this call (JWT 篇)
linux·javascript·typescript
涵涵(互关)18 小时前
语法大全-only-writer-two
前端·vue.js·typescript
拾贰_C18 小时前
【node.js | Ubuntu | update】如何升级旧的nodejs本版至最新;如何升级npm
ubuntu·npm·node.js
漫游的渔夫19 小时前
前端开发者做 Agent:Tool Calling 别只写函数名,用 Schema 少踩 5 个坑
前端·人工智能·typescript
湖边看客20 小时前
在 Windows PowerShell 里给 Node.js 设置内存上限
node.js
zhensherlock21 小时前
Protocol Launcher 系列:Beorg 高效任务管理的协议支持
前端·javascript·typescript·node.js·自动化·github·js