Тип «Задача» не удовлетворяет ограничению «Документ»

#mongodb #typescript #mongoose #nestjs

#mongodb #typescript #мангуст #nestjs

Вопрос:

Я создаю API с использованием Nestjs и Mongodb. задачи.service.ts, попытался создать конечную точку GetAll и получил ошибку typescript: Type 'Task' does not satisfy the constraint 'Document'. Type 'Task' is missing the following properties from type 'Document': increment, model, $isDeleted, remove, and 51 more.

задачи.service.ts

 import { Injectable, HttpStatus } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Task } from './dto/task.inferface';

@Injectable()
export class TasksService {
  private readonly Tasks: Task[] = [];

  constructor(@InjectModel('Task') private readonly TaskModel: Model<Task>) {}

  async getAll(): Promise<Task> {
    const tasks = await this.TaskModel.find().exec();
    return tasks;
  }
}
 

Ответ №1:

Расширьте класс document из интерфейса.

 import { Document } from 'mongoose';

export interface Task extends Document {
 //Task info ...
} 

Ответ №2:

  1. Задача не должна быть DTO, она должна быть сущностью типа:

tasks.entity.ts

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

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

export const TaskSchema = SchemaFactory.createForClass(Task);
 
  1. Вам также необходимо зарегистрировать эту модель в вашем модуле:
 @Module({
  imports: [
    MongooseModule.forFeature([
      {
        name: Task.name,
        schema: TaskSchema,
      },
    ]),
  ],
})
 
  1. Таким образом, ваш код будет выглядеть примерно так
 import { Injectable, HttpStatus } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Task } from './entities/task.entity';

@Injectable()
export class TasksService {
  constructor(@InjectModel(Task.name) private readonly TaskModel: Model<Task>) {}

  async getAll(): Promise<Task> {
    const tasks = await this.TaskModel.find().exec();
    return tasks;
  }
}