ush*_*her 7 serialization node.js typescript nestjs class-transformer
我想通过 nestjs 序列化技术序列化控制器响应。我没有找到任何方法,我的解决方案如下:
export type UserRoleType = "admin" | "editor" | "ghost";
@Entity()
export class User {
@PrimaryGeneratedColumn() id: number;
@Column('text')
username: string;
@Column('text')
password: string;
@Column({
type: "enum",
enum: ["admin", "editor", "ghost"],
default: "ghost"
})
roles: UserRoleType;
@Column({ nullable: true })
profileId: number;
}
Run Code Online (Sandbox Code Playgroud)
import { Exclude } from 'class-transformer';
export class UserResponse {
id: number;
username: string;
@Exclude()
roles: string;
@Exclude()
password: string;
@Exclude()
profileId: number;
constructor(partial: Partial<UserResponse>) {
Object.assign(this, partial);
}
}
import { Exclude, Type } from 'class-transformer';
import { User } from 'src/_entities/user.entity';
import { UserResponse } from './user.response';
export class UsersResponse {
@Type(() => UserResponse)
users: User[]
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
@Controller('user')
export class UsersController {
constructor(
private readonly userService: UserService
) {
}
@UseInterceptors(ClassSerializerInterceptor)
@Get('all')
async findAll(
): Promise<UsersResponse> {
let users = await this.userService.findAll().catch(e => { throw new NotAcceptableException(e) })
let rsp =new UsersResponse()
rsp.users = users
return rsp
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我必须将 db 查询结果显式分配给响应用户成员。有没有更好的办法?非常感谢
这里是实际的响应和想要的结果,以获得更好的解释。
{
"users": [
{
"id": 1,
"username": "a"
},
{
"id": 2,
"username": "bbbbbb"
}
]
}
Run Code Online (Sandbox Code Playgroud)
{
{
"id": 1,
"username": "a"
},
{
"id": 2,
"username": "bbbbbb"
}
}
Run Code Online (Sandbox Code Playgroud)
我建议直接将@Exclude装饰器放在实体类上,User而不是复制UserResponse. 以下答案假设您已经这样做了。
如果你看一下 的代码ClassSerializerInterceptor,你会发现它自动处理数组:
return isArray
? (response as PlainLiteralObject[]).map(item =>
this.transformToPlain(item, options),
)
: this.transformToPlain(response, options);
Run Code Online (Sandbox Code Playgroud)
但是,如果您直接返回数组,它只会转换它们,所以return users不要return {users: users}:
@UseInterceptors(ClassSerializerInterceptor)
@Get('all')
async findAll(): Promise<User> {
return this.userService.findAll()
}
Run Code Online (Sandbox Code Playgroud)
如果您需要嵌套响应,那么您的方法是一个很好的解决方案。或者,您可以直接调用类转换器,serialize而不是使用ClassSerializerInterceptor. 它还自动处理数组:
import { serialize } from 'class-transformer';
@Get('all')
async findAll(): Promise<UsersResponse> {
const users: User[] = await this.userService.findAll();
return {users: serialize(users)};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16143 次 |
| 最近记录: |