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

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

前文介绍了序列化的一般用法。这里再介绍一组工具函数。通过工具函数可以更加便利的使用序列化能力

工具清单

工具: @Serializer 工具: v 说明
@Serializer.transform v.serializerTransform 使用Serializer Transform,参见: 序列化
@Serializer.exclude v.serializerExclude 排除字段
@Serializer.replace v.serializerReplace 对字段值进行脱敏处理
@Serializer.getter v.serializerGetter 采用getter机制生成新的字段值
@Serializer.custom v.serializerCustom 使用自定义函数对字段值进行处理
既然`@Serializer`工具非常简洁,直观,为什么还要提供`v`工具?  1. `v`工具可以实现通过 App Config 修改配置 2. `v`工具和`@Serializer`工具底层逻辑是一致的 

@Serializer.transform/v.serializerTransform

比如,将EntityStudent中的name字段值转化为大写

我们直接使用序列化中创建的 Serializer Transform upper

1. @Serializer.transform

class EntityStudent { + @Serializer.transform('demo-student:upper')   @Api.field(v.title($locale('Name')))   name: string; } 

2. v.serializerTransform

class EntityStudent { + @Api.field(v.serializerTransform('demo-student:upper'), v.title($locale('Name')))   name: string; } 

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
// onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: {           serializerTransforms: {             'demo-student:upper': {},           },         },       },     },   }, }; 
  • 方法 2: 构造一个新的 schema
import { $makeSchema, v } from 'vona-module-a-openapi';  // onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: $makeSchema(v.serializerTransform('demo-student:upper'), z.string()),       },     },   }, }; 

@Serializer.exclude/v.serializerExclude

比如,排除EntityStudent中的name字段

1. @Serializer.exclude

class EntityStudent { + @Serializer.exclude()   @Api.field(v.title($locale('Name')))   name: string; } 

2. v.serializerExclude

class EntityStudent { + @Api.field(v.serializerExclude(), v.title($locale('Name')))   name: string; } 

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
// onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: { exclude: false },       },     },   }, }; 
  • 方法 2: 构造一个新的 schema
import { $makeSchema, v } from 'vona-module-a-openapi';  // onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: $makeSchema(v.serializerExclude(), z.string()),       },     },   }, }; 

@Serializer.replace/v.serializerReplace

比如,将EntityStudent中的name字段值进行脱敏处理

比如,name 原始值为tom,脱敏之后为t***m

1. @Serializer.replace

class EntityStudent { + @Serializer.replace({ patternFrom: /(w)(w+)(w)/, patternTo: '$1***$3' })   @Api.field(v.title($locale('Name')))   name: string; } 

2. v.serializerReplace

class EntityStudent {   @Api.field( +   v.serializerReplace({ patternFrom: /(w)(w+)(w)/, patternTo: '$1***$3' }),     v.title($locale('Name')),   )   name: string; } 

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
// onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: {           serializerTransforms: {             'a-serialization:replace': {               patternFrom: /(w)(w+)(w)/,               patternTo: '$1***$3',             },           },         },       },     },   }, }; 
  • a-serialization:replace: a-serialization模块提供的 Serializer Transform
  • 方法 2: 构造一个新的 schema
import { $makeSchema, v } from 'vona-module-a-openapi';  // onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: $makeSchema(           v.serializerReplace({ patternFrom: /(w)(w+)(w)/, patternTo: '$1***$3' }),           z.string(),         ),       },     },   }, }; 

@Serializer.getter/v.serializerGetter

比如,EntityStudent中的fullName字段由firstNamelastName字段组合而成

1. getter

class EntityStudent {   @Api.field()   firstName: string;    @Api.field()   lastName: string;    @Api.field() + get fullName(): string | undefined { +   return `${this.firstName} ${this.lastName}`; + } } 

2. @Serializer.getter

class EntityStudent { + @Serializer.getter((data: EntityStudent) => { +   return `${data.firstName} ${data.lastName}`; + })   @Api.field()   fullName: string; } 

3. v.serializerGetter

class EntityStudent { + @Api.field(v.serializerGetter((data: EntityStudent) => { +   return `${data.firstName} ${data.lastName}`; + }))   fullName: string; } 

4. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
// onions config.onions = {   entity: {     'demo-student:student': {       fields: {         fullName: {           serializerTransforms: {             'a-serialization:getter': {               getter: (data: EntityStudent) => {                 return `${data.firstName} ${data.lastName}`;               },             },           },         },       },     },   }, }; 
  • a-serialization:getter: a-serialization模块提供的 Serializer Transform
  • 方法 2: 构造一个新的 schema
import { $makeSchema, v } from 'vona-module-a-openapi';  // onions config.onions = {   entity: {     'demo-student:student': {       fields: {         fullName: $makeSchema(           v.serializerGetter((data: EntityStudent) => {             return `${data.firstName} ${data.lastName}`;           }),           z.string(),         ),       },     },   }, }; 

@Serializer.custom/v.serializerCustom

比如,将EntityStudent中的name字段值转换为大写

1. @Serializer.custom

class EntityStudent { + @Serializer.custom((value: string) => { +   return value.toUpperCase(); + })   @Api.field(v.title($locale('Name')))   name: string; } 

2. v.serializerCustom

class EntityStudent {   @Api.field( +   v.serializerCustom((value: string) => { +     return value.toUpperCase(); +   }),     v.title($locale('Name')),   )   name: string; } 

3. App Config

可以在 App Config 中修改配置

src/backend/config/config/config.ts

  • 方法 1: 直接修改 Openapi 参数
// onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: {           serializerTransforms: {             'a-serialization:custom': {               custom: (value: string) => {                 return value.toUpperCase();               },             },           },         },       },     },   }, }; 
  • a-serialization:custom: a-serialization模块提供的 Serializer Transform
  • 方法 2: 构造一个新的 schema
import { $makeSchema, v } from 'vona-module-a-openapi';  // onions config.onions = {   entity: {     'demo-student:student': {       fields: {         name: $makeSchema(           v.serializerCustom((value: string) => {             return value.toUpperCase();           }),           z.string(),         ),       },     },   }, }; 

资源

发表评论

评论已关闭。

相关文章