在 MEAN Stack 中处理分页后端

17 Mar 2025 | 4 分钟阅读

在我们之前的章节中,我们成功地将分页器添加到我们的前端。 我们成功地为分页器添加了一些属性并添加了页面事件。 现在,我们必须在后端工作,以便我们可以使用页面数据来缩小我们从后端检索的项目的数量。 我们将按照以下步骤编写分页器的后端代码

我们在 posts.js 文件中实现分页,我们在其中创建了一个用于获取帖子的路由。 我们将借助所谓的查询参数来做到这一点。 这些是我们可以添加到 URL 中的可选参数或信息片段。 我们可以将它们添加到 URL 的末尾,用问号与我们的域和路径分隔。

1) 我们可以通过访问 request 在我们的 express 应用程序的后端轻松检索信息片段。 我们使用“request.query”,它将保存解析后的查询参数信息。 我们将向您展示它是如何工作的。 我们只是将“request.query”对象记录到控制台,看看里面有什么。


Working on the Pagination Backend in MEAN Stack

我们将保存该文件,我们的后端将重新启动。 我们在浏览器中打开一个新选项卡并输入 https://:3000/api/posts,这是我们的帖子路由,然后是问号。 之后,我们添加 pageSize 等于 2 和 page=1 或添加另一个参数,例如 something 等于 good。 查询参数由“&”分隔,所以我们将使用“&”符号分隔 pageSize、page 和 something,如下所示

https://:3000/api/posts?pagesize=2&page=1&something=good

如果我们输入,我们将检索所有帖子,这意味着我们仍然到达该路由,并且它像以前一样工作。

Working on the Pagination Backend in MEAN Stack

在我们的服务器日志中,我们在那里看到了查询对象。

Working on the Pagination Backend in MEAN Stack

2) 所以,这是我们检索到的数据,因为我们发送了一个请求,其中添加了这些查询参数到 URL。 因此,它们被方便地为我们解析,并允许我们使用它们来更改我们的 mongoose 查询,以缩小我们获取的帖子数量,这可以很容易地完成。 所以,我们将通过以下方式从查询对象中检索该数据


Working on the Pagination Backend in MEAN Stack

3) 现在,我们要调整我们的 mongoose 查询,并且很酷的是,如果我们没有传递 pagesize 和 currentpage,那么 pageSize 和 CurrentPage 将未定义。 因此,我们将检查 PageSize 和 CurrentPage 是否未定义。 如果它们都包含有效值,则将执行“if 块”。


Working on the Pagination Backend in MEAN Stack

4) 现在,我们可以构造两个不同的查询。 Post.find 用于获取所有帖子,然后调整一个以获取给定页面的帖子切片。 为此,我们将创建一个新常量,并将其命名为 postquery,因为 Mongoose 的酷炫之处在于我们可以通过链接多个查询方法来构建查询,这将缩小我们的查询,并且默认情况下,我们的 postquery 是 Post.find()。 在使用默认 postquery 创建常量之后,我们将用 postquery 替换 postmodel.find,如下所示


Working on the Pagination Backend in MEAN Stack

5) 现在,如果我们有有效的 PageSize 和 CurrentPage 值,我们需要操纵查询,我们将在“if 块”中执行此操作。 在“if 块”中,我们将使用 Mongoose 提供的两种有用的方法。 第一个是 skip() 方法,这意味着我们不会检索所有帖子,而是跳过前 n 个帖子。 因此,我们将添加 “PageSize * [CurrentPage-1]” 作为参数。

如果我们位于第 2 页且页面大小为 10,它将跳过 10(10*2-1=10) 个帖子。 同样,如果我们位于第 3 页且页面大小为 10,那么它将跳过 20(10*3-1 = 10*2 = 20) 个帖子。


Working on the Pagination Backend in MEAN Stack

这将跳过之前的页面。

6) 我们还希望缩小我们为当前页面检索的文档数量。 我们将通过链接另一种方法来做到这一点,即 limit() 方法。 此方法限制我们返回的文档数量。 在此方法中,我们只需传递 PageSize,因为如果每页有 10 个项目,那么我们需要将查询限制为仅返回 10 个项目。


Working on the Pagination Backend in MEAN Stack

现在,我们得到了调整后的 postquery 并尝试执行它。 我们将 pagesize 设置为 2,将 currentpage 设置为 1。 当我们按下回车键时,我们将得到以下错误

Working on the Pagination Backend in MEAN Stack

7) 收到此错误的原因是我们使用了无效类型。 限制字段应为数字。 默认情况下,如果我们从这些查询参数中提取内容,它将始终是一个字符串,因为它来自 URL。 我们需要在这里使用数字。 为了将它们转换为数字,我们只需在 pagesize 和 currentpage 前面添加一个加号,如下所示


Working on the Pagination Backend in MEAN Stack

现在,我们保存它并再试一次。

Working on the Pagination Backend in MEAN Stack

现在,我们的后端代码运行良好,在下一节中,我们将 angular 关联到它。