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