Serialization 在使用Typegoose获取数据时,如何使用类转换器序列化nest js响应?

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

我一直在尝试使用类转换器库,使用Typegoose完成Mongodb序列化部分的NestJs示例。中给出的示例仅显示如何在TypeORM中使用序列化。我对Typegoose也遵循同样的流程。以下是我到目前为止所做的尝试

// 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 
  }
  ...
}