#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 для получения поддержки типов
- Код для добавления плагина 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);
- Теперь в документе интерфейса сообщений
export interface Message extends Document {
// Your schema fields here
}
- Теперь вы можете легко получить метод 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>>