如何在Express.js项目中同时使用@casl/mongoose与mongoose-paginate-v2
@casl/mongoose与mongoose-paginate-v2兼容使用解决方案
报错根因
两个插件均基于Mongoose Schema扩展能力,但方法返回值不支持链式调用:
accessibleBy()返回普通Mongoose Query实例,默认未挂载paginate方法paginate()是异步方法,返回的是包含分页数据的结果对象,不是Model/Query实例,不存在accessibleBy方法
解决步骤
1. 正确注册插件
首先确认你已经给对应Schema同时注册了两个插件:
const mongoose = require('mongoose'); const { accessibleRecordsPlugin } = require('@casl/mongoose'); const mongoosePaginate = require('mongoose-paginate-v2'); const personSchema = new mongoose.Schema({ // 你的模型字段定义 }); // 依次注册两个插件,顺序不影响 personSchema.plugin(accessibleRecordsPlugin); personSchema.plugin(mongoosePaginate); const Person = mongoose.model('Person', personSchema);
2. 正确组合两个方法的调用逻辑
不要使用链式调用,将CASL生成的权限过滤条件作为查询参数传入paginate的第一个入参即可:
const results = await Person.paginate( // 提取accessibleBy生成的权限过滤条件 Person.accessibleBy(req.ability).getQuery(), options // 你的分页配置参数 );
如果需要叠加其他自定义查询条件,合并两个查询对象即可:
const customQuery = { age: { $gte: 18 } }; const abilityQuery = Person.accessibleBy(req.ability).getQuery(); const results = await Person.paginate( { ...customQuery, ...abilityQuery }, options );
内容的提问来源于stack exchange,提问作者abd0991
相关产品推荐
相关产品推荐

