Skip to Content
📚 Tutorial🔗 Express Js9) Paginations

Paginations

1. Offset and Limit Pagination

For medium / small database.

  • offset: Determines the starting point.
  • limit: Determines numbers of data to get per call.
server.ts
import { eq, asc } from 'drizzle-orm'; // Only These limit number is accepted to prevent large data call const limitNumberLs = [ 10, 20, 50, 100 ] // /cards?offset=100&limit=20 app.get('/cards', (req: Request, res: Response) => { // Assume offset is refer to data ID const offset: number = +req.query.offset || 0; let limit: number = +req.query.limit || 10; // Limit the max limit number if(!limitNumberLs.includes(limit)){ limit = 10 } // Assume Using "drizzle" const data = await db.query.card.findMany({ limit: limit, offset: offset, orderBy: [asc(card.id)] }); res.json(data); });

2. Cursor-based pagination

For large database to query data in a faster way to prevent slow offest.

  • cursor: Refer the which data id.
server.ts
import { gt, asc } from 'drizzle-orm'; // Only These limit number is accepted to prevent large data call const limitNumberLs = [ 10, 20, 50, 100 ] // /cards?cursor=778&limit=20 app.get('/cards', (req: Request, res: Response) => { // Assume cursor is refer to data ID const cursor: number = +req.query.cursor || 0; let limit: number = +req.query.limit || 10; // Limit the max limit number if(!limitNumberLs.includes(limit)){ limit = 10 } // Assume Using "drizzle" const data = await db.query.card.findMany({ where: gt(card.id, cursor) limit: limit, orderBy: [asc(card.id)] }); res.json(data); });

3. Page-Based Pagination

For medium / small database.

  • page: Determines the starting page.
  • limit / size: Determines numbers of data to get per call.
server.ts
import { eq, asc } from 'drizzle-orm'; // Only These limit number is accepted to prevent large data call const limitNumberLs = [ 10, 20, 50, 100 ] // /cards?page=1&limit=20 app.get('/cards', (req: Request, res: Response) => { // Assume offset is refer to data ID const page: number = +req.query.page || 1; let limit: number = +req.query.limit || 10; // Limit the max limit number if(!limitNumberLs.includes(limit)){ limit = 10 } // Assume Using "drizzle" const data = await db.query.card.findMany({ limit: limit, offset: page * limit, orderBy: [asc(card.id)] }); res.json(data); });

4. Page Token Pagination

Adding you params as encrypted token from { id: 10 } to MTAwCg== (e.g. Base64)

  • nextPageToken: Determines the token to get the next page params.

Let’s implement the token with Cursor-based pagination

server.ts
import { encode, decode } from 'js-base64'; import { eq, asc } from 'drizzle-orm'; // Let say `eyBpZDogMTE0IH0=` = `{ id: 114 }` // /cards?nextPage=eyBpZDogMTE0IH0= app.get('/cards', (req: Request, res: Response) => { const nextPage: string = req.query.nextPage || ""; let cursor: = 0; try { if(nextPage !== ""){ const decodedToken = JSON.parse(nextPage); !!decodedToken["id"] && (cursor = decodedToken["id"]) } } catch (error) { cursor = 0 } const limit = 10 // Assume Using "drizzle" const data = await db.query.card.findMany({ where: gt(card.id, cursor) limit: limit, orderBy: [asc(card.id)] }); res.json({ data, previousPageToken: nextPage, nextPageToken: encode(JSON.stringify({ id: cursor + limit })) }); });

In advance, you may implement more data into your token (e.g. limit, conditions) for filtering.

Samples:

{ "id": 56, "limit": 50 }
Last updated on