mongoose 如何在Nest JS中管理接口/模型/验证类?

mtb9vblg  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(188)

我刚刚开始在一个新项目中使用Nest JS,我对所有的锅炉板代码感到非常沮丧,特别是当涉及到DTO类,Mongoose模式和接口时。到目前为止,我一直这样做的方式是,我有一个接口,它描述了我的集合文档中需要的字段,然后我有DTO类用于验证,它实现了这些接口,然后还有Mongoose的Schemas,它必须简单地镜像接口(因为它们不能直接实现它们afaik)。这意味着如果我改变了文档结构中的一件事,我必须在三个不同的地方更新它。此外,还有双重验证:在模式和DTO类上。
难道我不能完全放弃DTO类,只使用接口和模式,并在将文档插入数据库时简单地进行验证吗?如果这不是一个好主意,有没有其他的替代方案,不需要我在三个不同的地方更改代码?使用DTO create类而不是接口怎么样?

EDIT:似乎简单地使用create DTO而不是接口就可以了。我将停止使用接口,继续前进。

u4dcyp6a

u4dcyp6a1#

在NestJS中,可以为实体使用一个DTO类来实现Mongoose模式定义和验证。NestJS提供了一个名为:@nestjs/mongoose(如果您还没有使用它),它允许您使用Typescript类和装饰器定义Mongoose模式。用于定义Mongoose模式的相同DTO类也可以用于使用@nestjs/class-validator和管道来定义验证规则,方法是使用来自class-validator的验证装饰器来装饰类属性。下面的类充当Mongoose模式,同时处理验证:

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { IsNotEmpty, IsString, IsEmail } from 'class-validator';
import { HydratedDocument } from 'mongoose';

export type UserDocument = HydratedDocument<User>;

@Schema()
export class User {
  @IsNotEmpty()
  @IsString()
  @Prop({ required: true })
  name: string;

  @IsNotEmpty()
  @IsEmail()
  @Prop({ required: true, unique: true })
  email: string;

  @IsNotEmpty()
  @IsString()
  @Prop({ required: true })
  password: string;
}

export const UserSchema = SchemaFactory.createForClass(User);

要了解更多关于它的信息,请阅读以下关于NestJS官方文档的页面:

我希望你发现这个答案有帮助。

相关问题