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
相关产品推荐
相关产品推荐

