PassportLocalDocument и PaginateModel в одном интерфейсе?

#node.js #mongodb #typescript #mongoose #nestjs

#node.js #mongodb #typescript #мангуст #nestjs

Вопрос:

Я относительно новичок в typescript и NestJS framework. В настоящее время я хотел бы реализовать механизм разбивки на страницы для всех моделей в моем приложении. В текущем проекте api я использую NestJS с mongoose.

Моя схема пользователя следующая

 export const UserSchema = new mongoose.Schema({
  firstName: String,
  lastName: String,
  email: String,
  phone: String,
  password: {
    type: String
  }
});

UserSchema.plugin(mongoosePaginate);
UserSchema.plugin(passportLocalMongoose, {
  usernameField: 'email',
});
  

Мой пользовательский интерфейс следующий:

 export interface IUser extends PassportLocalDocument {
  readonly firstName: string;
  readonly lastName: string;
  readonly email: string;
  readonly phone: string;
  readonly password: string;
}
  

И мой пользовательский сервис следующий:

 @Injectable()
export class UsersService implements IUsersService {
  constructor(@InjectModel('User') private readonly userModel: PassportLocalModel<IUser>) {
  }

  async findAll(): Promise<IUser[]> {
    return await this.userModel.find().exec();
  }
  

Я хотел бы добавить функциональность mongoose-paginate через мой пользовательский интерфейс, чтобы я мог получить к ней доступ в службе через this.userModel.paginate .

Я упоминаю, что я установил: "@types/mongoose-paginate": "^5.0.6" и "mongoose-paginate": "^5.0.3" , и я могу импортировать PaginateModel из mongoose .

Я думаю, IUser интерфейс должен выглядеть примерно так :

export interface IUser<T extends PassportLocalDocument > extends PaginateModel<T> {} но я не уверен, ни как создать его экземпляр при внедрении в сервис.

Жду ваших ответов, ребята, и спасибо! 😀

Ответ №1:

Это фрагмент для тех, кто использует плагин mongoose для разбиения на страницы с nestjs. Вы также можете установить @types/mongoose-paginate для получения поддержки типов

  1. Код для добавления плагина paginate в схему:
 import { Schema } from 'mongoose';
import * as mongoosePaginate from 'mongoose-paginate';

export const MessageSchema = new Schema({
// Your schema definitions here
});

// Register plugin with the schema
MessageSchema.plugin(mongoosePaginate);
  
  1. Теперь в документе интерфейса сообщений
 export interface Message extends Document {
// Your schema fields here
}

  
  1. Теперь вы можете легко получить метод paginate внутри класса service следующим образом
 import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { PaginateModel } from 'mongoose';
import { Message } from './interfaces/message.interface';

@Injectable()
export class MessagesService {
    constructor(
        // The 'PaginateModel' will provide the necessary pagination methods
        @InjectModel('Message') private readonly messageModel: PaginateModel<Message>,
    ) {}

    /**
     * Find all messages in a channel
     *
     * @param {string} channelId
     * @param {number} [page=1]
     * @param {number} [limit=10]
     * @returns
     * @memberof MessagesService
     */
    async findAllByChannelIdPaginated(channelId: string, page: number = 1, limit: number = 10) {
        const options = {
            populate: [
                // Your foreign key fields to populate
            ],
            page: Number(page),
            limit: Number(limit),
        };
        // Get the data from database
        return await this.messageModel.paginate({ channel: channelId }, options);
    }
}
  

Комментарии:

1. @Totoro это связано с вашим tsconfig, поскольку эта функция работала в более ранней версии приложения. Я полагаю, что причиной этой проблемы являются недавние обновления конфигураций tsconfig.

Ответ №2:

Я подошел к ситуации по-другому. Я создал 2 интерфейса, 1 для регистрации / аутентификации, а другой для манипулирования данными.

Как только вы импортируете PaginateModel, вам нужно расширить свой интерфейс с помощью Document .

export interface IUser extends Document

Впоследствии, когда вы внедряете его в свой сервис:

@InjectModel('User') private readonly userModel: PaginateModel<IUser>

И, наконец, в вашем интерфейсе сервиса и реализации сервиса измените возвращаемый тип следующим образом:

async findAll(yourParams: YourParamsDto): Promise<PaginateResult<IUser>>