2017-11-03 7 views
2

페이지 네이션 (Sagination)을 구현하는 데 어려움이 있습니다. 몇 가지 예제 코드 나 힌트 만 있으면 올바른 방향으로 나아갈 수 있습니다.Google Datastore의 NodeJS Express 페이지 매김 커서 컨트롤을 UI 컨트롤과 통합하는 방법

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); 
    }); 
}); 

답변

1

한 가지가 Limitations of cursors 목록의 첫 번째 항목입니다 Paginating 기록 :

  • 커서가 같은에서만 사용할 수 있습니다 프로젝트는 원래 쿼리를 수행하고 동일한 쿼리를 계속 수행하기 만하면됩니다. 원래 생성 된 동일한 쿼리를 설정하지 않고 커서를 사용하여 결과를 검색 할 수는 없습니다 ( ).

그래서 당신은 항상 당신이 다른 하나 개의 요청에서 NUM_RESULTS_PER_PAGE 값에 해당하는 주위에 전달해야 의미 핸들러 내부에 원래의 질의를 다시 만들 수 있어야합니다. 또한 값이 변경 될 때마다 쿼리를 다시 설정해야합니다. 즉, 페이지 당 표시되는 결과 수를 변경 한 후 현재 위치에서 계속 찾아 볼 수 없습니다.

그런 다음 페이지 매김을 사용하려면 요청마다 현재 커서 값을 전달해야하며 요청마다 업데이트해야합니다.

이제 NodeJS 사용자가 아니므로 한 요청에서 다른 요청으로 전달되는 값이 일반적으로 어떻게 구현되는지 정확하게 알 수 있습니다.귀하의 코드에 req.query.nextPageCursorfrontEndResponse.nextPageCursor가이 용도로 사용되는 것으로 보입니다. 그러나 괜찮은지 여부는 알 수 없습니다. 어쩌면이 질문에 대한 대답을 찾기가 쉽지 않을 수 있습니다.

예를 들어, 파이썬 webapp2에서 한 요청에서 사용자 세션에 서버 측 값을 저장하고 후속 요청에서 세션에서 값을 읽을 수 있습니다. 이것이 도움이된다면 도노.

+0

고마워요! 나는 커서의 한계를 알고있다. 페이징을 프론트 엔드 UI 컨트롤과 통합하는 방법에 대한 지침을 찾고 있습니다. 각진 페이지 매김 서비스를 만드는 방법을 알고 있지만, 모든 데이터를 한꺼번에 가져 오는 것이므로 데이터베이스 커서를 사용하여 설정하는 방법을 모릅니다. – pengz