#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