博客分页实现按最新发布降序排列的技术求助
解决分页时博客按创建时间降序排列的问题
嘿,我一眼就发现问题所在啦!你的博客Schema里存储创建时间的字段是created,但你在排序逻辑里一直用的是date——这就是排序没生效的核心原因!
具体修正步骤:
- 给搜索分支修正排序字段:把
sort('-date')替换为sort('-created')(或者等价的sort({created: -1})写法) - 给非搜索分支添加排序逻辑:原来的非搜索查询完全没加排序规则,需要补上相同的排序配置
修正后的完整代码:
// INDEX ROUTE router.get("/blogs", function (req, res) { var perPage = 10; var pageQuery = parseInt(req.query.page); var pageNumber = pageQuery ? pageQuery : 1; var noMatch = null; if (req.query.search) { const regex = new RegExp(escapeRegex(req.query.search), 'gi'); Blog.find({name: regex}) .skip((perPage * pageNumber) - perPage) .limit(perPage) .sort('-created') // 修正排序字段为Schema中定义的created .exec(function (err, blogs) { Blog.count({name: regex}).exec(function (err, count) { if (err) { console.log("ERROR!"); } else { if (blogs.length < 1) { noMatch = "No blogs match that query, please try again"; } res.render("blogs/index", {blogs: blogs, current: pageNumber, pages: Math.ceil(count / perPage), currentUser: req.user, noMatch: noMatch, search: req.query.search}); } }); }); } else { Blog.find({}) .skip((perPage * pageNumber) - perPage) .limit(perPage) .sort('-created') // 新增排序规则,字段名匹配Schema .exec(function (err, blogs) { Blog.count().exec(function (err, count) { if (err) { console.log("ERROR!"); } else { res.render("blogs/index", {blogs: blogs, current: pageNumber, pages: Math.ceil(count / perPage), currentUser: req.user, noMatch: noMatch, search: false}); } }); }); } });
额外说明:
你之前尝试的那些排序写法本身都是正确的,但因为字段名和Schema不匹配(Schema里是created而非date),所以完全没起到作用。如果更习惯用date作为字段名,也可以把Schema里的created字段重命名为date,但更推荐保持现有Schema结构,修正排序的字段名即可。
另外,为了减少代码冗余,你可以把重复的分页+排序逻辑抽成一个单独的函数,这样后续维护会更方便~
内容的提问来源于stack exchange,提问作者JS Bach
相关产品推荐
相关产品推荐

