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

基于Mongoose和GraphQL实现谷歌式数字分页的问题

解决Mongoose Paginate v2 + GraphQL分页缺少当前页和总页数的问题

你遇到的问题核心有两个:一是GraphQL Schema的返回类型没法承载分页元数据,二是使用mongoose-paginate-v2时可能混用了分页模式,导致部分字段未返回。我来一步步帮你解决:

1. 修正GraphQL Schema,新增分页结果类型

你当前的pagProducts查询直接返回[Product]数组,这种结构没办法包含当前页、总页数这类分页信息。我们需要创建一个专门的分页结果类型来统一承载数据和分页元数据:

type Product{
 _id: String
 title: String!
 price: Float
 unitydetail: String
 unityForPound: Int
}

# 新增分页结果类型,包含数据列表和所有分页元数据
type ProductPaginatedResult {
  docs: [Product!]!
  totalDocs: Int!
  limit: Int!
  page: Int!
  totalPages: Int!
  offset: Int
  hasPrevPage: Boolean
  hasNextPage: Boolean
}

type Query {
 # 修改返回类型为新的分页结果类型
 pagProducts(offset: Int, limit: Int, page: Int): ProductPaginatedResult
}

2. 调整Resolver代码,正确使用mongoose-paginate-v2

注意:mongoose-paginate-v2里不要同时混用page和offset参数,这是两种完全不同的分页模式(页码分页 vs 偏移量分页),同时传递会导致优先级冲突,默认情况下用page模式时offset会被忽略,反之亦然。另外要直接返回完整的分页结果,不要只处理数据部分:

const Product = require('../models/Product');

async function pagProducts(root, args) {
  console.log(args.page);
  // 二选一:选择一种分页模式,不要同时启用page和offset
  const options = {
    limit: args.limit || 10, // 设置默认条数,避免参数缺失报错
    // 模式一:基于页码的分页(推荐,会返回page、totalPages等字段)
    page: args.page || 1,
    // 模式二:基于偏移量的分页(如果用这个就不要传page,不会返回页码相关字段)
    // offset: args.offset || 0,
  };

  try {
    // 直接返回paginate的完整结果,无需嵌套then
    const result = await Product.paginate({}, options);
    console.log(result); // 现在应该能看到page、totalPages这些字段了
    return result;
  } catch (err) {
    console.error('分页查询出错:', err);
    throw err; // 抛出错误让GraphQL统一处理
  }
}

module.exports = { pagProducts };

3. 关键注意事项

  • 确保你的Product模型已经正确挂载了mongoose-paginate-v2插件,否则分页功能无法正常工作:
    const mongoose = require('mongoose');
    const mongoosePaginate = require('mongoose-paginate-v2');
    
    const productSchema = new mongoose.Schema({
      title: String,
      price: Number,
      unitydetail: String,
      unityForPound: Number,
      // 其他字段...
    });
    
    productSchema.plugin(mongoosePaginate); // 必须挂载插件
    module.exports = mongoose.model('Product', productSchema);
    
  • 当使用page模式时,mongoose-paginate-v2才会返回page(当前页)、totalPages(总页数)、hasPrevPage、hasNextPage这些字段;如果用offset模式,因为偏移量分页本身没有“页码”的概念,这些字段不会生成。

按以上步骤调整后,你就能在GraphQL查询中获取到当前页和总页数的信息了。

内容的提问来源于stack exchange,提问作者user3821102

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:20:59