Pagination

ראינו פעולות שעובדות על המידע ב-DB. נניח שיש לי 1000 ספרים ב-DB, אני לא רוצה למשוך את כל ה-1000 ביחד, אלא כל פעם חלק ולהציג אותו למשתמש. את זה אפשר לבצע על ידי שליחת פרמטרים ל-Url.

נניח שאנחנו רוצים לחלק את במידע לעמודים ובכל פעם לקבל עמוד אחר, נוכל להוסיף בפרמטרים את הפרמטר p עם ערך של העמוד. למשל p=1.

כדי לקבל את הערך של הפרמטר נשתמש במשתנה ה-req שאנחנו מקבלים לפונקציה. נחזור לפונקצית get ונוסיף את המשתנה pages. נשים כברירת מחדל את הערך 0 במידה ואין פרמטר על מנת לקבל את העמוד הראשון.

const page = req.query.p || 0

עכשיו צריכים להחליט כמה רשומות יהיו בעמוד, מכיוון שאין לנו הרבה רשומות נניח שבכל עמוד אנחנו רוצים 3 רשומות.

נצטרך לקחת את מספר העמוד, להכפיל אותו במספר הרשומות לעמוד ולדלג לרשומה המתאימה. למשל אם יש 10 בעמוד ואני רוצה את עמוד 2, אז ניקח 2*10 שזה 20, נדלג 20 רשומות ונגיע לרשומות 21-30.

פונקציית get נראית ככה עכשיו.

app.get('/books', (req, res) => {
    const page = req.query.p || 0
    const booksPerPage = 3

    let books = []

    db.collection('books')
        .find()
        .sort({ author: 1 })
        .skip(page * booksPerPage)
        .limit(booksPerPage)
        .forEach(book => books.push(book))
        .then(() => {
            res.status(200).json(books)
        })
        .catch(() => {
            res.status(500).json({ error: "No data fetching"})
        })
})

אם נקרא לכתובת http://localhost:3000/books נקבל את העמוד הראשון של הספרים. בכתובת http://localhost:3000/books/?p=1 נקבל את העמוד השני וכן הלאה.