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

NodeJS+MongoDB分页异常:所有页面仅显示前4条数据

问题修复方案
  • 核心问题1:MongoDB查询顺序错误
    你把limit()放在了skip()之前,这会导致先截取前limit条数据,再跳过指定数量,结果永远只能拿到前limit条的部分数据,自然看不到后续页面。正确的顺序应该是先执行skip()跳过前面的条目,再用limit()截取指定数量的内容。

  • 核心问题2:查询参数未转为数字类型
    req.query获取的page和limit都是字符串类型,直接参与计算可能引发隐式转换错误,建议显式转为数字类型。

修复后的代码:

//routes
app.get("/bookstore", (req, res) => {
  // 显式转换为数字并设置默认值
  const page = parseInt(req.query.page) || 1;
  const limit = parseInt(req.query.limit) || 4;

  let mybook = [];
  db.collection("bookstore")
    .find()
    .sort({ author: 1 })
    .skip((page - 1) * limit) // 先跳过对应页数的条目
    .limit(limit) // 再截取当前页需要的数量
    .forEach((book) => mybook.push(book))
    .then(() => {
      return res.json(mybook);
    })
    .catch(() => {
      return res.send("there were an error");
    });
});

额外优化建议

可以在返回结果中加入总数据量、总页数等信息,方便前端做分页逻辑:

//routes
app.get("/bookstore", (req, res) => {
  const page = parseInt(req.query.page) || 1;
  const limit = parseInt(req.query.limit) || 4;

  // 同时获取总数据量和当前页数据
  Promise.all([
    db.collection("bookstore").countDocuments(),
    db.collection("bookstore")
      .find()
      .sort({ author: 1 })
      .skip((page - 1) * limit)
      .limit(limit)
      .toArray() // 用toArray直接获取数组,替代手动push
  ]).then(([total, mybook]) => {
    res.json({
      total,
      totalPages: Math.ceil(total / limit),
      currentPage: page,
      data: mybook
    });
  }).catch(err => {
    res.send(`there were an error: ${err.message}`);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:50:14