如何在同一项目中同时使用mongoose-paginate-v2和mongoose-aggregate-paginate-v2
两个Mongoose分页插件共存方案
两个分页插件冲突的核心原因:默认都会为Schema注入名为paginate的方法,如果你采用全局注册插件的方式,后注册的插件会覆盖之前插件注入的同名方法,就会出现你遇到的报错。
方案1:按Schema单独注册插件(推荐)
不要使用全局注册插件的方式,针对需要不同分页能力的Schema单独注册对应的插件即可,代码示例如下:
// 引入依赖 const mongoose = require('mongoose'); const mongoosePaginate = require('mongoose-paginate-v2'); const mongooseAggregatePaginate = require('mongoose-aggregate-paginate-v2'); // 示例1:仅需要普通分页能力的模型 const userSchema = new mongoose.Schema({ username: String, phone: String }); userSchema.plugin(mongoosePaginate); const User = mongoose.model('User', userSchema); // 示例2:仅需要聚合分页能力的模型 const orderSchema = new mongoose.Schema({ userId: mongoose.Types.ObjectId, amount: Number, createTime: Date }); orderSchema.plugin(mongooseAggregatePaginate); const Order = mongoose.model('Order', orderSchema);
这种方式下两个插件的注册范围完全隔离,不会出现方法覆盖问题。
方案2:同一模型需要同时使用两种分页能力
如果某个业务模型同时需要普通分页和聚合分页能力,可以在注册聚合分页插件时自定义方法名,避免覆盖:
const productSchema = new mongoose.Schema({ name: String, price: Number, categoryId: mongoose.Types.ObjectId }); // 先注册普通分页插件,保留默认的paginate方法名 productSchema.plugin(mongoosePaginate); // 注册聚合分页插件时自定义方法名 productSchema.plugin(mongooseAggregatePaginate, { customName: 'aggregatePaginate' }); const Product = mongoose.model('Product', productSchema); // 调用时区分方法即可 // 普通分页查询 Product.paginate(query, options) // 聚合分页查询 Product.aggregatePaginate(aggregate, options)
内容的提问来源于stack exchange,提问作者CARLV
相关产品推荐
相关产品推荐

