NestJS 与猫鼬模式、接口和 dto 方法问题

Posted

技术标签:

【中文标题】NestJS 与猫鼬模式、接口和 dto 方法问题【英文标题】:NestJS with mongoose schema, interface and dto approach question 【发布时间】:2020-08-03 15:57:10 【问题描述】:

我是 nestJS 和 mongoDB 的新手,我不清楚为什么我们需要为要保存在 mongoDB 中的每个集合声明 DTO、模式和接口。 IE。我有一个集合(不幸的是,我将其命名为 collection 但没关系)这是我的 DTO:

export class CollectionDto 
  readonly description: string;
  readonly name: string;
  readonly expiration: Date;

界面:

import  Document  from 'mongoose';

export interface Collection extends Document 
  readonly description: string;
  readonly name: string;
  readonly expiration: Date;

和架构:

import * as mongoose from 'mongoose';

export const CollectionSchema = new mongoose.Schema(
  name: 
    type: String,
    required: true,
  ,
  description: 
    type: String,
    required: false,
  ,
  expiration: 
    type: String,
    required: true,
  
);

我怀疑我们真的需要多达三个内容几乎相同的对象吗?第一眼看起来很奇怪。

【问题讨论】:

【参考方案1】:

我在普通的 nodejs 基础上经常使用 mongoose,并且我也开始使用 NestJS。 Mongoose 定义了两件事,以便您可以使用 mongodb 创建、查询、更新和删除文档:Schema 和 Model。你已经有了你的模式,对于普通猫鼬的模型应该是:

import * as mongoose from 'mongoose';

export const CollectionSchema = new mongoose.Schema(
  name: 
    type: String,
    required: true,
  ,
  description: 
    type: String,
    required: false,
  ,
  expiration: 
    type: String,
    required: true,
  
);
const Collection = mongoose.model('collections', CollectionSchema);

这里的收藏将是猫鼬模型。到目前为止一切顺利。

在 NestJs 中,如果您要遵循 API 最佳实践,您将使用 DTO(数据传输对象)。文档中的 NestJs 提到使用类比使用接口更可取,因此您在这里不需要接口。定义 Mongoose 架构时,也可以定义 Model/Schema:

import  Prop, Schema, SchemaFactory  from '@nestjs/mongoose';
import  Document  from 'mongoose';

export type CollectionDocument = Collection & Document;

@Schema()
export class Collection 
  @Prop()
  name: string;

  @Prop()
  description: number;

  @Prop()
  expiration: string;


export const CollectionSchema = SchemaFactory.createForClass(Collection);

对于您的服务和控制器,您同时使用(模型和 DTO):

import  Model  from 'mongoose';
import  Injectable  from '@nestjs/common';
import  InjectModel  from '@nestjs/mongoose';
import  Collection, CollectionDocument  from './schemas/collection.schema';
import  CollectionDto  from './dto/collection.dto';

@Injectable()
export class CollectionService 
  constructor(@InjectModel(Collection.name) private collectionModel: Model<CollectionDocument>) 

  async create(createColDto: CollectionDto): Promise<Collection> 
    const createdCollection = new this.collectionModel(CollectionDto);
    return createdCollection.save();
  

  async findAll(): Promise<Collection[]> 
    return this.collectionModel.find().exec();
  

在此之后,您可以使用 Swagger 自动生成 API 文档。 NestJS Mongo Techniques

【讨论】:

以上是关于NestJS 与猫鼬模式、接口和 dto 方法问题的主要内容,如果未能解决你的问题,请参考以下文章

将 TypeScript 枚举与猫鼬模式一起使用

NestJs:为啥我们不使用 DTO 来替换所有接口?

Expressjs 与猫鼬。并在子文档中获取外键子文档

Expressjs 与猫鼬。并在子文档中获取外键子文档

将模糊搜索与猫鼬一起使用时出现打字稿错误

将模糊搜索与猫鼬一起使用时出现打字稿错误