扩展mongoose模式中的接口以添加插件方法

prdp8dxp  于 2022-11-24  发布在  Go
关注(0)|答案(3)|浏览(142)

我有一个带有自定义接口的架构模型:

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);

如果我导出没有IPost接口的Post Model,我可以在我的路由中使用.paginate(),但是不能使用IPost接口。我试着在我的接口中添加方法,试图从mongoose-paginate-v2类型扩展,但是我没有得到它。
我如何将mongoose-paginate-v2中的.paginate()方法添加到我的接口中?谢谢。

rfbsl7qr

rfbsl7qr1#

你可以自己扩展

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);
slsn1g29

slsn1g292#

我也是非常新的 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;
zbdgwd5y

zbdgwd5y3#

截至2022年4月19日,插件GitHub网站上有一个示例:https://github.com/aravindnc/mongoose-paginate-v2#typescript
如果有人想更深入地了解使用TypeScript时如何扩展mongoose,我也建议您阅读以下内容:https://mongoosejs.com/docs/typescript/statics-and-methods.html

相关问题