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;
}
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() { }
}
@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
}
動作しますが、dbクエリの結果を応答ユーザーのメンバーに明示的に割り当てる必要があります。もっと良い方法はありますか?どうもありがとう
ここで、より良い説明のために、実際の応答と必要な結果。
{
"users": [
{
"id": 1,
"username": "a"
},
{
"id": 2,
"username": "bbbbbb"
}
]
}
{
{
"id": 1,
"username": "a"
},
{
"id": 2,
"username": "bbbbbb"
}
}
うわー、私が知っているなら、なんと簡単でしょう!これで問題は解決しました。また、クラストランスフォーマー@Exclue()デコレーターを使用したユーザーエンティティの推奨事項。
そして、私はこの使用例ではカスタムのUsersResponseクラスを必要としないことを知っています。この解決策は私が探していたものでしたが、私はこれを非常に簡単な方法でやりすぎました
あなたの超高速の回答と問題の解決に感謝します。
ロストックからベルリンへの挨拶:)
ここに私の最終的なアプローチ:
@UseInterceptors(ClassSerializerInterceptor)
@Get('all')
async findAll(
): Promise<User> {
return await this.userService.findAll().catch(e => { throw new NotAcceptableException(e) })
}
import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn, OneToMany } from 'typeorm';
import { Profile } from './profile.entity';
import { Photo } from './photo.entity';
import { Album } from './album.entity';
import { Exclude } from 'class-transformer';
export type UserRoleType = "admin" | "editor" | "ghost";
@Entity()
export class User {
@PrimaryGeneratedColumn() id: number;
@Column('text')
username: string;
@Exclude()
@Column('text')
password: string;
@Column({
type: "enum",
enum: ["admin", "editor", "ghost"],
default: "ghost"
})
roles: UserRoleType;
@Exclude()
@Column({ nullable: true })
profileId: number;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
@OneToMany(type => Album, albums => albums.user)
albums: Album[];
@OneToOne(type => Profile, profile => profile.user)
@JoinColumn()
profile: Profile;
}
[
{
"id": 1,
"username": "a",
"roles": "admin"
},
{
"id": 2,
"username": "bbbbbb",
"roles": "ghost"
}
]