You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:15:03