Serialization 在使用Typegoose获取数据时,如何使用类转换器序列化nest js响应?
我一直在尝试使用类转换器库,使用Typegoose完成Mongodb序列化部分的NestJs示例。中给出的示例仅显示如何在TypeORM中使用序列化。我对Typegoose也遵循同样的流程。以下是我到目前为止所做的尝试Serialization 在使用Typegoose获取数据时,如何使用类转换器序列化nest js响应?,serialization,response,nestjs,class-transformer,typegoose,Serialization,Response,Nestjs,Class Transformer,Typegoose,我一直在尝试使用类转换器库,使用Typegoose完成Mongodb序列化部分的NestJs示例。中给出的示例仅显示如何在TypeORM中使用序列化。我对Typegoose也遵循同样的流程。以下是我到目前为止所做的尝试 // cat.domain.ts import { prop } from '@typegoose/typegoose'; export class Cat { @prop() name: string; @prop() age: number; @p
// cat.domain.ts
import { prop } from '@typegoose/typegoose';
export class Cat {
@prop()
name: string;
@prop()
age: number;
@prop()
breed: string;
}
// cats.service.ts
@Injectable()
export class CatsService {
constructor(
@InjectModel(Cat) private readonly catModel: ReturnModelType<typeof Cat>,
) {}
findAll(): Observable<Cat[]> {
return from(this.catModel.find().exec());
}
findOne(id: string): Observable<Cat> {
return from(this.catModel.findById(id).exec());
}
...
}
// cat.response.ts
import { ObjectId } from 'mongodb';
import { Exclude, Transform } from 'class-transformer';
export class CatResponse {
@Transform(value => value.toString(), { toPlainOnly: true })
_id?: ObjectId;
name: string;
age: number;
@Exclude()
breed: string;
constructor(partial: Partial<CatResponse>) {
Object.assign(this, partial);
}
}
// cats.controller.ts
@Controller('cats')
@UseInterceptors(ClassSerializerInterceptor)
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
findAll(): Observable<CatResponse[]> {
return this.catsService.findAll();
}
@Get(':id')
findOne(@Param() params: FindOneParamsDto): Observable<CatResponse> {
return this.catsService.findOne(params.id);
}
...
}
有人能帮我正确序列化响应吗?更新:
class transformer现在可以与typegoose一起正常工作
(),typegoose(&mongoose)与类转换器/类验证器不兼容
这是因为typegoose需要将类转换为模式,mongoose会将其编译为模型(不再是类)这里有一个解决方法:
// cats.controller.ts
...
import { classToPlain } from "class-transformer";
...
@Controller('cats')
@UseInterceptors(ClassSerializerInterceptor)
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
findAll(): Observable<CatResponse[]> {
const cats = this.catsService.findAll();
// transforming the Model to CatResponse class...
const catResponses = cats.map(cat => classToPlain(new CatResponse(cat.toJSON())))
return catResponses;
}
@Get(':id')
findOne(@Param() params: FindOneParamsDto): Observable<CatResponse> {
const cat = this.catsService.findOne(params.id);
const catResponse = classToPlain(new CatResponse(cat.toJSON()));
return
}
...
}
//cats.controller.ts
...
从“类转换器”导入{classToPlain};
...
@控制器(“猫”)
@UseInterceptors(ClassSerializerInterceptor)
导出类CATS控制器{
构造函数(专用只读catsService:catsService){}
@得到()
findAll():可观察{
const cats=this.catsService.findAll();
//正在将模型转换为CatResponse类。。。
const catResponses=cats.map(cat=>classToPlain(新的catResponses(cat.toJSON()))
返回catResponses;
}
@获取(':id')
findOne(@Param()参数:findoneparamsdo):可观察{
const cat=this.catsService.findOne(params.id);
const catResponse=classToPlain(新的catResponse(cat.toJSON());
返回
}
...
}
希望能有所帮助。您建议我如何从回复中排除项目?我在考虑做一些类似的事情,比如创建一个转换拦截器和一个定制的装饰器,并在拦截器中检查装饰器,但这似乎需要做很多工作,我还没有那么丰富的经验。有更简单的方法吗?当它是像“password”这样的值时,您可以将“select:false”设置为
@prop
选项,默认情况下,它不包含在任何查询中,而无需再次显式选择它,否则将其转换为(通过.toJSON
或.lean
)并过滤掉您不想要的任何内容(黑名单/白名单)在使用MONGOOSE获取数据时,如何使用类转换器序列化nest js响应?
// cats.controller.ts
...
import { classToPlain } from "class-transformer";
...
@Controller('cats')
@UseInterceptors(ClassSerializerInterceptor)
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
findAll(): Observable<CatResponse[]> {
const cats = this.catsService.findAll();
// transforming the Model to CatResponse class...
const catResponses = cats.map(cat => classToPlain(new CatResponse(cat.toJSON())))
return catResponses;
}
@Get(':id')
findOne(@Param() params: FindOneParamsDto): Observable<CatResponse> {
const cat = this.catsService.findOne(params.id);
const catResponse = classToPlain(new CatResponse(cat.toJSON()));
return
}
...
}