node.js - NodeJS Express 分页与 Google Datastore 如何将游标查询与 UI 控制集成

标签 node.js google-app-engine pagination

我一直致力于实现分页,我只需要一些帮助,要么是一些示例代码,要么只是一个提示来帮助我朝着正确的方向前进。

我正在寻找有关如何将 Google Datastore 数据库游标与前端 UI 分页控件集成的指导。我知道如何构建角度分页服务,但这是一次检索所有数据,并且由于性能问题(5,000 条以上记录),我想使用游标来检索子集中的数据。

注意:这里有一个类似的问题,但我需要比这个已接受的答案提供的更多细节。 Node pagination in google datastore

问题:如何将分页数据存储游标查询与前端 UI 控件集成,以允许用户选择当前页面并控制每个页面上显示的结果数量?

我需要构建一个页面,通过动态分页显示大量记录。用户必须能够选择每页上显示的记录数。

由于一次可能返回数千条记录,因此我想使用游标来检索数据子集。

文档中有一个如何分页的示例,但这是一个非常基本的示例,没有演示如何与前端 UI 控件集成。

任何人都可以提供更详细的示例和/或为我指明从何处开始执行此要求的正确方向吗?不幸的是我无法在网上找到任何详细的示例。

https://googlecloudplatform.github.io/google-cloud-node/#/docs/datastore/1.1.0/datastore

记录分页

var express = require('express');
var app = express();

var NUM_RESULTS_PER_PAGE = 15;

app.get('/contacts', function(req, res) {
  var query = datastore.createQuery('Contacts')
    .limit(NUM_RESULTS_PER_PAGE);

  if (req.query.nextPageCursor) {
    query.start(req.query.nextPageCursor);
  }

  datastore.runQuery(query, function(err, entities, info) {
    if (err) {
      // Error handling omitted.
      return;
    }

    // Respond to the front end with the contacts and the cursoring token
    // from the query we just ran.
    var frontEndResponse = {
      contacts: entities
    };

    // Check if  more results may exist.
    if (info.moreResults !== datastore.NO_MORE_RESULTS) {
      frontEndResponse.nextPageCursor = info.endCursor;
    }

    res.render('contacts', frontEndResponse);
  });
});

最佳答案

需要记住的一件事是 Limitations of cursors 上的第一项列表:

  • A cursor can be used only by the same project that performed the original query, and only to continue the same query. It is not possible to retrieve results using a cursor without setting up the same query from which it was originally generated.

因此,您需要始终能够在处理程序中重新创建原始查询,这意味着您需要将相当于 NUM_RESULTS_PER_PAGE 值的值从一个请求传递到另一个请求。您还需要在每次值更改时重置查询 - 这意味着在更改每页显示的结果数后您无法继续从原来的位置浏览。

然后,为了能够使用分页,您还需要将当前光标值从一个请求传递到另一个请求,并在每个请求时更新。

现在我不是 NodeJS 用户,所以我可以准确地讲述通常如何实现将值从一个请求传递到另一个请求。在您的代码中, req.query.nextPageCursorfrontEndResponse.nextPageCursor 似乎是用于此目的,但我无法判断这是否可以。也许这是一个不太具体的问题,更容易找到答案。

例如,在 python webapp2 中,我可以在一个请求中将这些值存储在用户 session 的服务器端,并在后续请求中从 session 中读取它们。不知道这是否有任何帮助。

关于node.js - NodeJS Express 分页与 Google Datastore 如何将游标查询与 UI 控制集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47096793/

相关文章:

php - Yii:更改用于分页的 Sql 请求

java - 使用 Intellij Idea 和 gradle 在 App Engine 上调试本地主机

java - 在 Google AppEngine 数据存储中使用 500 多个字符字符串

php - Cakephp错误: in paginator joins generated query

javascript - GULP 显示 "ACCESS DENIED"

node.js - socket.io 获取当前套接字所在的房间

node.js - 在 Node.JS 和 TypeScript 中实现 UDP 命令确认通信协议(protocol)

javascript - 运行 nodejs Thrift 示例时找不到对 Thrift 的引用

java - Google Blobstore 提供的图像的 Google Appengine 签名或临时 URL

php - 推荐一个分页程序 AJAX PHP