Để implement pagination hoàn chỉnh cho toàn dự án, bạn cần:
Hàm utility tái sử dụng (ví dụ, getPaginatedPosts): nhận vào page, limit, và optional là các filters (category, tag, author…) tính offset = (page - 1) × limit sử dụng findAndCountAll với distinct: true để lấy cả data và total count sau đó return object chứa posts, totalItems, totalPages, và currentPage. Routes linh hoạt xử lý cả URL có và không có page number (ví dụ: /posts và /posts/page/2), validate page number, và quan trọng là truyền baseUrl phù hợp với từng context (homepage, category, tag, search…) vào view. Pagination component (partial EJS/template) nhận totalPages, currentPage, và baseUrl, render các nút Previous/Next, hiển thị window 5 pages xung quanh current page với logic dots (ellipsis) khi cần luôn đảm bảo page 1 link đến baseUrl (không có /page/1), còn các page khác link đến baseUrl/page/N. Biến môi trường POSTS_PER_PAGE để config số items mỗi trang, và tuỳ chọn thêm SEO meta tags (canonical, prev/next) trong layout để search engines index đúng. So sánh MongoDB vs SQL
MongoDB:
SQL/Sequelize:
Cả hai đều làm cùng một việc: bỏ qua N records đầu tiên và lấy M records tiếp theo.
Giải thích Offset trong Sequelize
Offset là gì?
Offset là số lượng records cần bỏ qua (skip) trước khi bắt đầu lấy data.
Tại sao lại (page - 1)?
Hãy xem ví dụ cụ thể với limit = 10:
SQL Query tương đương
Hàm getPaginatedPosts
1. Cấu trúc cơ bản
2. Build WHERE clause
3. Build INCLUDE với conditions
4. findAndCountAll - Lấy data + count
Tại sao cần distinct: true?
5. Return pagination metadata
Tính totalPages:
Sử dụng hàm getPaginatedPosts trong Routes / Controller
Tại sao cần baseUrl trong pagination.ejs?
Vấn đề
Pagination component cần tạo links cho các trang, nhưng URL structure khác nhau tùy context:
Giải pháp: baseUrl
Trong pagination.ejs
Ví dụ cụ thể
Scenario 1: Homepage posts
Scenario 2: Category posts
Scenario 3: Tag posts
Pagination Logic Chi Tiết
Hiển thị window của pages
Ví dụ với totalPages = 20, currentPage khác nhau:
Dots (ellipsis) logic
Best Practices
1. Validate page number
2. Set reasonable limits
3. Cache total count
4. SEO: Canonical URLs
Tham khảo thêm