Node.js7 min read

Pagination Strategies

Implement efficient pagination. Learn offset and cursor-based pagination.

Sarah Chen
December 19, 2025
0.0k0

Pagination Strategies

Why Pagination?

Loading 10,000 records at once:

  • Slow response time
  • High memory usage
  • Poor user experience
  • Database overload

Solution: Load data in pages (10-50 items at a time).

Offset-Based Pagination

app.get('/products', async (req, res) => {
  const page = parseInt(req.query.page) || 1;
  const limit = parseInt(req.query.limit) || 10;
  const skip = (page - 1) * limit;
  
  const [products, total] = await Promise.all([
    Product.find().skip(skip).limit(limit),
    Product.countDocuments()
  ]);
  
  res.json({
    products,
    pagination: {
      currentPage: page,
      totalPages: Math.ceil(total / limit),
      totalItems: total,
      hasNextPage: page < Math.ceil(total / limit),
      hasPrevPage: page > 1
    }
  });
});

Cursor-Based Pagination

app.get('/posts', async (req, res) => {
  const limit = 10;
  const cursor = req.query.cursor;
  
  let query = {};
  if (cursor) {
    query._id = { $lt: cursor };
  }
  
  const posts = await Post.find(query)
    .sort({ _id: -1 })
    .limit(limit + 1);
  
  const hasMore = posts.length > limit;
  const items = hasMore ? posts.slice(0, -1) : posts;
  
  res.json({
    posts: items,
    nextCursor: hasMore ? items[items.length - 1]._id : null,
    hasMore
  });
});

Better for real-time data (like social media feeds).

With Filtering

app.get('/products', async (req, res) => {
  const page = parseInt(req.query.page) || 1;
  const limit = 10;
  const skip = (page - 1) * limit;
  
  const query = {};
  if (req.query.category) {
    query.category = req.query.category;
  }
  if (req.query.minPrice) {
    query.price = { $gte: parseInt(req.query.minPrice) };
  }
  
  const [products, total] = await Promise.all([
    Product.find(query).skip(skip).limit(limit),
    Product.countDocuments(query)
  ]);
  
  res.json({
    products,
    pagination: {
      page,
      limit,
      total,
      pages: Math.ceil(total / limit)
    }
  });
});

Key Takeaway

Use offset pagination for simple cases. Cursor pagination for real-time feeds. Always include total count. Support filtering with pagination.

#Node.js#Pagination#API#Performance