NestJS-是否在DTO中投放?

时间:2020-05-22 23:01:03

标签: mongodb nestjs

我试图在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的正确方法是什么?仅仅是手动将消息解析为其组成部分并专门解析该字段吗?

2 个答案:

答案 0 :(得分:0)

在有效负载中,您的项目prop是一个ID(十六进制格式)。您可以直接将其保存到数据库中。 如果要保存objectId,请再次获取项目对象,然后选择对象的ID作为objectId。

但是我认为id作为十六进制字符串就足够了。

答案 1 :(得分:0)

我也一直在努力解决这个问题,在尝试了百万次尝试之后,最终对我有用的是使用猫鼬的Types.ObjectId中的Schema,如下所示:

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架构冲突。

编辑

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

Facts Source