使用class-transformer进行返回参数拦截中的js对象处理
一般的按照官方说明进行使用并不会有什么问题,但是涉及到对象嵌套的情况,则会有一些小坑
例如,有如下两个entity:
/**role.ts*/
export class RoleEntity {
id: number;
name: string;
constructor(partial: Partial<RoleEntity>) {
Object.assign(this, partial);
}
}
/** user.ts*/
import { Exclude, Expose, Transform } from 'class-transformer';
import { RoleEntity } from './role';
export class UserEntity {
id: number;
firstName: string;
lastName: string;
@Exclude()
password: string;
@Expose()
role: RoleEntity;
constructor(partial: Partial<UserEntity>) {
Object.assign(this, partial);
}
}
调用方法如下:
@Get('test')
@Get()
@SerializeOptions({
strategy: 'excludeAll',
})
@UseInterceptors(ClassSerializerInterceptor)
findOne(): UserEntity {
return new UserEntity({
id: 1,
firstName: 'Kamil',
lastName: 'Mysliwiec',
password: 'password',
role: new RoleEntity({ id: 1, name: 'admin' }),
});
}
此时,是无法返回role属性的,因为RoleEntity中并未对其属性进行Expose,即使UserEntity中对role进行了暴露,最终也只是会返回{}而已。所以,需要对RoleEntity中的属性进行Expose设置,才会返回user.role中的属性key与value。像这样:
/**role.ts*/
export class RoleEntity {
@Expose()
id: number;
@Expose()
name: string;
constructor(partial: Partial<RoleEntity>) {
Object.assign(this, partial);
}
}
此外,对象必须是类的实例,也就是必须是通过构造方法创建的对象。以下两个对象是不同的:
class User {
name: string
}
const user1 = new User({name: 'zz'});
const user2 = {name: 'zz'}

浙公网安备 33010602011771号