【问题标题】:NestJS - Casting in DTO?NestJS - 在 DTO 中进行铸造?
【发布时间】:2020-09-09 21:23:57
【问题描述】:

我正在尝试在 Mongo(通过 websockets 网关)中创建一个对象,其架构如下:

export class Issue extends Document {
  @Prop()
  name: string;

  @Prop()
  description: string;

  @Prop()
  project: Types.ObjectId;
}

我的 DTO 也指 ObjectId 类型:

import { Types } from 'mongoose';

export class CreateIssueDto {
  readonly name: string;
  readonly description: string;
  readonly project: Types.ObjectId;
}

网关的 @MessageBody() 装饰器似乎将所有内容都作为字符串拉入,因此,引用的 project 在 mongo 中存储为字符串。

将其转换为ObjectId 的正确方法是什么?是否只是手动将消息解析为其组成部分并专门解析该字段?

【问题讨论】:

  • waffl 你能解决这个问题吗?

标签: mongodb nestjs


【解决方案1】:

我也一直在为这个问题而烦恼,在尝试了数百万件事之后,最终对我有用的是使用来自猫鼬的SchemaTypes.ObjectId,如下所示:

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Schema as MongooseSchema, Types } from 'mongoose';

@Schema()
export class Issue extends Document {
  @Prop()
  name: string;

  @Prop()
  description: string;

  @Prop({
    type: MongooseSchema.Types.ObjectId,
    ref: 'Project' // Your ref name, i've assumed it.
  })
  project: Types.ObjectId;
}

在你的 DTO 中做同样的事情,注意我添加了一个别名,所以它不会与 @nestjs/mongoose Schema 冲突。

编辑

在做了一些研究之后,我发现Types.ObjectIdSchema.Types.ObjectIdmongoose 之间存在差异,其中第一个用于模型实例,而后者用于定义模式字段,因此@ Prop({type}) 必须来自MongooseSchema.Types.ObjectId,并且属性的类型(在本例中为项目)必须使用Types.ObjectId,这就是将project 设置为ObjectId 的字符串表示的正确转换方式。

Facts Source

【讨论】:

    【解决方案2】:

    在有效负载中,您的项目道具是十六进制字符串格式的 id。您可以直接将其保存到数据库中。 如果您想保存 objectId,请再次获取项目对象并选择对象的 id 作为 objectId。

    但我认为 id 作为 hexstring 就足够了。

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多