在前后端别离开发的过程中,前端开发人员如果想要避免由于接口字段不同造成功率下降的问题,就需求将后端传递的plainText中的字段进行转化。显然这里是在运用层面上运用了适配器形式。本文介绍一个js库完成目标字段名的转化功用。

1. Class-Transformer根本运用步骤

Class-Transformer是一个用于转化类实例的库,首要用于在目标之间进行数据映射。以下是运用Class-Transformer的根本步骤:

1.1 安装Class-Transformer

经过npm或yarn安装Class-Transformer库:

npm install class-transformer

yarn add class-transformer

1.2 创建类实体

界说需求进行转化的类实体,例如:

// user.entity.ts
import { Expose } from 'class-transformer';
export class UserEntity {
  @Expose()
  id: number;
  @Expose()
  name: string;
  @Expose()
  email: string;
}

1.3 进行转化

在需求进行转化的地方,运用classToPlainplainToClass办法进行目标的转化:

// main.ts
import { classToPlain, plainToClass } from 'class-transformer';
import { UserEntity } from './user.entity';
const userObject = {
  id: 1,
  name: 'John Doe',
  email: 'john@example.com',
};
// 转化为UserEntity实例
const userInstance = plainToClass(UserEntity, userObject);
// 转化为普通JavaScript目标
const plainObject = classToPlain(userInstance);

2. Class-Transformer高档运用技巧

2.1 字段别名

经过@Expose装饰器设置字段的别名,用于在转化时更改字段称号:

// user.entity.ts
import { Expose } from 'class-transformer';
export class UserEntity {
  @Expose({ name: 'userID' })
  id: number;
  @Expose({ name: 'fullName' })
  name: string;
  @Expose()
  email: string;
}

2.2 转化嵌套目标

Class-Transformer支撑转化嵌套目标,运用@Type装饰器指定嵌套目标的类型:

// user.entity.ts
import { Expose, Type } from 'class-transformer';
import { RoleEntity } from './role.entity';
export class UserEntity {
  @Expose()
  id: number;
  @Expose()
  name: string;
  @Expose()
  email: string;
  @Type(() => RoleEntity)
  @Expose()
  roles: RoleEntity[];
}

3. Class-Transformer在前后端通信中的字段转化功用

Class-Transformer在前后端通信中的字段转化功用首要体现在处理后端回来的数据或前端发送的数据时,经过界说类实体并运用转化办法,完成字段称号的映射。在运用axios进行网络请求时,咱们能够在处理后端回来的数据时运用Class-Transformer进行字段转化。

举例说明

假设咱们有一个后端API回来的用户信息如下:

{
  "user_id": 1,
  "full_name": "John Doe",
  "email_address": "john@example.com"
}

而前端期望运用以下UserEntity类表示用户信息:

// user.entity.ts
import { Expose } from 'class-transformer';
export class UserEntity {
  @Expose({ name: 'user_id' })
  id: number;
  @Expose({ name: 'full_name' })
  name: string;
  @Expose({ name: 'email_address' })
  email: string;
}

如果运用的是js的话那就是:

const { plainToClass, Transform, Expose } = require('class-transformer');
class UserEntity {
  @Expose({ name: 'user_id' })
  id;
  @Expose({ name: 'full_name' })
  name;
  @Expose({ name: 'email_address' })
  email;
}

接下来,在前端进行网络请求时,能够运用axios获取后端回来的用户信息,并运用Class-Transformer进行字段转化:

// user.service.ts
import axios from 'axios';
import { plainToClass } from 'class-transformer';
import { UserEntity } from './user.entity';
export async function getUserInfo(userId: number): Promise<UserEntity> {
  try {
    const response = await axios.get(`/api/user/${userId}`);
    // 后端回来的数据进行字段转化为UserEntity实例
    const userEntity = plainToClass(UserEntity, response.data);
    return userEntity;
  } catch (error) {
    console.error('Error fetching user info:', error);
    throw error;
  }
}

在这个例子中,getUserInfo函数运用axios获取后端回来的用户信息,然后经过Class-Transformer的plainToClass办法将后端回来的数据转化为前端界说的UserEntity实例,完成了字段称号的映射。这样,在前端业务逻辑中,咱们能够直接运用UserEntity类表示用户信息,而不必关怀后端回来的原始字段称号。这种映射联系的界说能够使前后端在数据传递时愈加灵活和可维护。