Расширить интерфейс в схеме mongoose для добавления метода плагина

#node.js #typescript #mongoose

#node.js #typescript #mongoose

Вопрос:

У меня есть модель схемы с пользовательским интерфейсом:

 interface IPost extends Document {
    created: Date;
    mensaje: string;
    img: string[];
    coords: string;
    usuario: string;
    test: string;
}
  

Я использую этот интерфейс при экспорте модели:

 export const Post = model<IPost>('Post', postSchema);
  

Я хотел бы использовать плагин mongoose-paginate-v2, я инициализировал:

 postSchema.plugin(mongoosePaginate);
  

И если я экспортирую модель Post без моего интерфейса iPOST, я могу .paginate() использовать свой маршрут, но не с моим интерфейсом iPOST.
Я попытался добавить метод в свой интерфейс, пытаясь расширить из типов mongoose-paginate-v2, но у меня это не получилось.

Как я могу добавить .paginate() метод из mongoose-paginate-v2 в свой интерфейс? Спасибо.

Ответ №1:

Вы можете расширить его для себя

 interface IPpaginator {
        paginate(): void;

}

interface IPost extends Document, IPpaginator {
    created: Date;
    mensaje: string;
    img: string[];
    coords: string;
    usuario: string;
    test: string;
}
  

Обновления

 // import dependencies 
import { Document, Schema, Model, model} from "mongoose";

//export like a boss
export const Post: Model<IPost> = model<IPost>('Post', postSchema);
  

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

1. Получая ту же ошибку, я не знаю, неправильно ли я объяснил себя. Я хочу, чтобы при импорте Post model в мой маршрут можно было выполнять Post.paginate(). Теперь выдает ошибку, в которой говорится, что ‘paginate’ не существует в типе ‘Model<Ipost, {}>.

2. Та же ошибка. Я думаю, что мне нужно создать статический метод, а не метод экземпляра, но я не знаю, как, потому что плагин уже создает этот метод, но не работает при использовании моего пользовательского интерфейса.

Ответ №2:

Я тоже новичок в typescript, поэтому не смогу объяснить весь код, но вот решение.

/* PostModel.ts */

 import { Schema, model, PaginateModel } from 'mongoose';

interface IPost extends Document {
    created: Date;
    mensaje: string;
    img: string[];
    coords: string;
    usuario: string;
    test: string;
}

const postSchema = new Schema({
    created: Date.now(),
    mensaje: String,
    img: [String],
    coords: String,
    test: String,
})

export default model<IPost, MongooseModel<IPost>>('Post', postSchema);
  

импортируем вышеуказанный файл как:

 import postModel from './postModel.ts'

postModel.paginate(filters, options)
  

Теперь вы сможете использовать функцию разбиения на страницы.

Редактировать: Не забудьте добавить mongoose-paginate-v2. Лично мне нравится добавлять его при установлении соединения с базой данных. Чтобы мне не приходилось импортировать его в каждую схему, которую я создаю.

Вот как вы можете сделать то же самое:

 // DEPENDENCIES
import * as mongoose from 'mongoose';
import * as mongoosePaginate from 'mongoose-paginate-v2';

const connection = mongoose.connect(process.env.MONGODB_URI, {
  dbName: process.env.DB_NAME,
  authSource: 'admin',
  user: process.env.DB_USER,
  pass: process.env.DB_PASSWORD,
  useNewUrlParser: !0,
  useUnifiedTopology: !0,
  useCreateIndex: !0,
  useFindAndModify: !1,
  autoIndex: !0,
})
  .then(() => {
    console.log('Mongoose connected to db');
  })
  .catch((err: Error) => {
    console.log(err.message);
  });

mongoose.connection.on('connected', () => {
  console.log('Mongodb bridge connected');
});

mongoose.connection.on('error', (err: Error) => {
  console.log(`Mongoose connection ERROR: ${err}`);
});

mongoose.connection.on('disconnected', () => {
  console.log('Mongoose connection disconnected');
});

process.on('SIGINT', async () => {
  await mongoose.connection.close();
  process.exit(0);
});

mongoose.plugin(mongoosePaginate);

export default connection;
  

Ответ №3:

По состоянию на 19 апреля 2022 года на сайте плагина GitHub есть пример: https://github.com/aravindnc/mongoose-paginate-v2#typescript

Если кто-нибудь хотел бы получить более глубокое представление о расширении mongoose при использовании TypeScript, я бы также посоветовал прочитать это: https://mongoosejs.com/docs/typescript/statics-and-methods.html