Wie

2017-12-17 4 views
-1

mit Paginierung API Hapi JS und MYSQL bauen würde Ich mag eine API mit HAPI JS und MYSQL entwickeln Grenze und Offset-ParameterWie

Könnte jemand bitte mir Ressourcen vorschlagen, wie diese zu entwickeln.

Danke.

Beispiel: GET/Schulen offset = 10 & limit = 20

Antwort

0

Paging hängt sehr grundlegenden Prinzipien auf. Zuerst müssen Sie in einer bestimmten Abfrage wissen, die Sie auf der Seite anzeigen, die Sie haben, wie viele Zeilen haben Sie?

Zum Beispiel Auflistung Sie Blog-Post auf Ihrer Seite, erhalten Summenzeile

SELECT count(*) FROM blog_post_table; // cosnt numRows = Query...., 

Lasst uns sagen, es ist ;

Nun müssen Sie angeben, wie viele Zeilen auf einer Seite angezeigt werden. In Ihrem Beispiel gibt es einen Abfrageparameter "limit = 20", der unsere Frage beantwortet.

const perPage = request.query.limit || 20; 

Basierend auf dem Grenz-Parameter im Query-String oder mindestens 20 Elemente pro Seite, Validierung ist Ihre Hausaufgaben, Joi.

Dann sollten wir basierend auf unseren perPage-Informationen berechnen, wie viele Seiten da sein werden.

const totalPages = Match.ceil(numRows/perPage); 

Es in 9 führt, haben wir Math.ceil, Sie bekommen es Ich gehe davon aus, Sie nicht 168 mit 20 teilen kann, weil es 8 verbleibenden Elemente. Das Ergebnis w 8.4 bedeutet, dass wir eine weitere Seite benötigen, um die restlichen 8 Elemente anzuzeigen.

So weit so gut, jetzt müssen wir unseren Offset berechnen, wo wir anfangen, Daten zu lesen. Auf der ersten Seite beginnt es natürlich bei 0, aber was ist mit dem zweiten oder vierten oder neunten?

Jetzt brauchen wir einen aktuellen Seite Parameter, und wir sollten diese Informationen in Query-Strings (I verworfen Ihre offset = 10 Definition absichtlich) tragen, lassen Sie uns sagen, dass es Parameter in Abfragezeichenfolge Seite mit dem Namen

const currentPage = request.query.page || 1; // easy, yet harmful, it need validation 

Jetzt kennen wir unsere aktuelle Seite, jetzt können wir basierend auf diesen Zahlen unser Limit berechnen.

const offset = perPage * (currentPage - 1); 

zu realisieren, setzen Zahlen auf den Plätzen

const offset = 20 * (1-1); // page 1 offset = 0; 
const offset = 20 * (2-1); // page 1 offset = 20; 
. 
. 
. 
const offset = 20 * (9-1); // page 1 offset = 160; 

Jetzt können wir unsere Abfrage machen auf der Grundlage unserer Berechnungen.

const sql = `SELECT * FROM blog_post_table LIMIT ${perPage} OFFSET ${offset}`; 

Zeilen abrufen und an Ihre Seite senden. Einige zusätzliche Informationen sind hilfreich, wenn Sie eine ordnungsgemäße Paging-Schnittstelle anzeigen möchten.

Sagen wir, Ihre Antwortdaten sind so;

const response = { 
    'results': ['array of elements from db'], 
    'currentPage': currentPage, // learn object literals, it unnecessary, 
    'nextPage': currentPage + 1, // don't be that naive, validate this, 
    'lastPage': totalPages, // it is obvious 
    'previousPage': currentPage - 1, // what if we're in the very first page, then we can go to 0, validate! 
} 

BONUS: wenig Code, der vorherigen und nächsten Seiten erzeugt, keine perfekte Lösung es nur schnell aus.

const getOtherPages = (totalPages, currentPage) => { 
    previousPage = null 
    nextPage = null 

    if currentPage > totalPages or currentPage < 1: 
     return previousPage, nextPage 

    if currentPage > 1: 
     previousPage = currentPage - 1 

    if (currentPage + 1) < totalPages: 
     nextPage = currentPage + 1 

    return [previousPage, nextPage] 
} 

// Usage 
const [previousePage, nextPage] = getOtherPages(totalPages, currentPage);