我一直致力于实现分页,我只需要一些帮助,要么是一些示例代码,要么只是一个提示来帮助我朝着正确的方向前进。
我正在寻找有关如何将 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.nextPageCursor
和 frontEndResponse.nextPageCursor
似乎是用于此目的,但我无法判断这是否可以。也许这是一个不太具体的问题,更容易找到答案。
关于node.js - NodeJS Express 分页与 Google Datastore 如何将游标查询与 UI 控制集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47096793/