如何在使用 Typegoose 获取数据的同时使用类转换器序列化 Nest js 响应?

2024-01-05

我一直在尝试使用 Typegoose 使用类转换器库来完成 Mongodb 序列化部分的 NestJs 示例。给出的例子在https://docs.nestjs.com/techniques/serialization https://docs.nestjs.com/techniques/serialization仅展示如何在 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);
  }
  ...
}

我尝试使用 id 在 Get() 上运行 API 调用,而不是breed被排除在回复之外我得到了以下回复。

{
    "$__": {
        "strictMode": true,
        "selected": {},
        "getters": {},
        "_id": {
            "_bsontype": "ObjectID",
            "id": {
                "type": "Buffer",
                "data": [
                    94,
                    93,
                    76,
                    66,
                    116,
                    204,
                    248,
                    112,
                    147,
                    216,
                    167,
                    205
                ]
            }
        },
        "wasPopulated": false,
        "activePaths": {
            "paths": {
                "_id": "init",
                "name": "init",
                "age": "init",
                "breed": "init",
                "__v": "init"
            },
            "states": {
                "ignore": {},
                "default": {},
                "init": {
                    "_id": true,
                    "name": true,
                    "age": true,
                    "breed": true,
                    "__v": true
                },
                "modify": {},
                "require": {}
            },
            "stateNames": [
                "require",
                "modify",
                "init",
                "default",
                "ignore"
            ]
        },
        "pathsToScopes": {},
        "cachedRequired": {},
        "$setCalled": [],
        "emitter": {
            "_events": {},
            "_eventsCount": 0,
            "_maxListeners": 0
        },
        "$options": {
            "skipId": true,
            "isNew": false,
            "willInit": true
        }
    },
    "isNew": false,
    "_doc": {
        "_id": {
            "_bsontype": "ObjectID",
            "id": {
                "type": "Buffer",
                "data": [
                    94,
                    93,
                    76,
                    66,
                    116,
                    204,
                    248,
                    112,
                    147,
                    216,
                    167,
                    205
                ]
            }
        },
        "name": "Sylver",
        "age": 14,
        "breed": "Persian Cat",
        "__v": 0
    },
    "$locals": {},
    "$op": null,
    "$init": true
}

谁能帮助我如何正确序列化响应?


更新: 类转换器现在可以与 typegoose 一起正常工作,在这里查看有关如何使用它的文档 https://typegoose.github.io/typegoose/docs/guides/integration-examples/using-with-class-transformer


这是一个已知问题 https://typegoose.github.io/typegoose/docs/guides/known-issues (#108 https://github.com/typegoose/typegoose/issues/108), typegoose (& mongoose) 与 class-transformer/class-validator 不兼容
这是因为 typegoose 需要将类转换为模式,而 mongoose 会将其编译为模型(不再是类)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在使用 Typegoose 获取数据的同时使用类转换器序列化 Nest js 响应? 的相关文章

  • AS3 无法从 Java 发送的套接字解​​码 AMF3 对象

    我有一个 java 套接字服务器 它在连接时将 Animal 对象发送到 Flash 客户端 对象的发送方式如下 Amf3Output amf3Output new Amf3Output SerializationContext getSe
  • 我可以使用 DataContract 序列化程序序列化 Dictionary 吗?

    我计划构建一个 WCF 服务 返回序列化为 JSON 的通用字典对象 不幸的是 序列化失败 因为对象可能总是不同的 KnownTypes 没有帮助 因为属性类型是 Dictionary 而且我不能说 KnownType 因为类可能总是不同
  • 序列化的 lambda 且没有serialVersionUID?

    我正在尝试了解 Java 及其最新版本的序列化如何工作 我正在尝试像这样序列化 lambda Runnable r Runnable Serializable gt System out println This is a test 但我注
  • 在获得响应之前发出多个请求

    当并行发送多个请求时 在获得响应之前 我无法理解 HTTP 的工作原理 有两种情况 1 With Connection Keep Alive 根据HTTP规范 http www w3 org Protocols rfc2616 rfc261
  • 类似于eternity的C++对象持久化库

    我正在寻找一个 C 对象持久库来替换永恒图书馆 http sourceforge net projects eternity it 我已经用它制作了大约一天的原型 永恒图书馆的能力不足 我创建了一个与此类似的对象层次结构 我有一个std l
  • Django Rest Framework:如何为 PUT 和 PATCH 等更新操作设置字段为必填/只读?

    我有一个 Django 序列化器 它有一个字段 该字段仅适用于 PUT 和 PATCH 等更新操作 但不适用于 POST 等创建操作 我发现这个类似的SOquestion https stackoverflow com q 30953481
  • 为 Json 对象生成的 C# 类的优点和缺点

    我有示例 Json 我需要将其序列化为 C 对象 我决定为此目的利用杠杆Json Net http json codeplex com 图书馆 我还需要有 C 类来表示这个 Json 可以使用创建类Json C 类生成器 http json
  • 为什么我的 .Net 对象不可序列化?

    我有一个继承自 System Data DataTable 的 MyDataTable 类 我已经在我的类中实现了 ISerialized 并且有一个 公共覆盖子 GetObjectData 但是 当我尝试序列化 MyDataTable 的
  • NestJs:如何使 Body 输入形状与实体的 DTO 不同?

    我的照片和标签对象有 DTO 如下所示 export class PhotoDto readonly title string readonly file string readonly tags TagDto export class T
  • (可选)根据运行时值序列化属性

    从根本上讲 我想根据序列化时的值包含或省略生成的 Json 中的属性 更具体地说 我有一个类型 它知道是否已为其分配了值 并且我只想序列化该类型的属性 如果有 has是分配给它的东西 所以我需要在运行时检查该值 我试图让我的 API 更容易
  • 在 Java 中序列化静态属性

    如果我尝试序列化静态属性会发生什么 thanks 由此article http java sys con com node 36149 技巧 1 处理静态变量 Java classes often hold some globally re
  • 如何在一对一关系上使用 onDelete: 'CASCADE'

    当用户被删除时 我尝试删除用户的个人资料 但它并没有删除个人资料上的任何内容 用户实体 Entity export class User PrimaryGeneratedColumn id number Column name string
  • WCF 服务已超出最大数组长度配额 (16384)

    我有一个 wsf 服务和一个客户端应用程序 在尝试与客户端和服务进行通信时 我收到以下消息 格式化程序在尝试反序列化消息时引发异常 尝试反序列化参数时出错http tempuri org blob http tempuri org blob
  • django REST框架多源领域

    假设我的 models py 中有这些 models py class Theme models Model An theme is an asset of multiple levels adventure models ForeignK
  • 我们为什么使用序列化?

    为什么我们需要使用序列化 如果我们想通过网络发送一个对象或一段数据 我们可以使用字节流 如果我们想将一些数据保存到磁盘上 我们可以再次使用二进制模式和字节流来保存它 那么使用序列化有什么好处呢 从技术上讲 在低级别上 您的序列化对象也将最终
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 单元测试序列化有什么要点吗?

    我有一个类 它序列化一组我想要进行单元测试的对象 使用 XML 序列化 我的问题是 感觉我将测试 XML 序列化的 NET 实现 而不是任何有用的东西 我还有一个先有鸡还是先有蛋的场景 为了测试 Reader 我需要一个由 Writer 生
  • 使用 Boost 序列化并发送数据结构?

    我有一个如下所示的数据结构 typedef struct unsigned short m short1 unsigned short m short2 unsigned char m character MyDataType 我想使用 b
  • 最适合“正在进行的作业”的 HTTP 状态代码

    向客户端提供的最合适的 HTTP 状态代码是什么 表示 您的请求很好 但仍在进行中 请稍后在完全相同的位置回来查看 例如 假设客户端提交初始请求以启动繁重的查询 服务器立即返回一个 URL 客户端可以定期轮询该 URL 以获取结果 如果客户
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du

随机推荐