Well-structured backends separate concerns: routers define URLs, controllers translate HTTP to application calls, services own data access, and middleware handles cross-cutting behavior (validation, 404, errors). Study these patterns to keep files small, testable, and aligned with REST conventions.

How to use query string parameters — Basic

Optional filters and flags after ? in the URL (e.g. ?sort=desc&limit=10) are on req.query. Use for sorting, pagination, and search—not for resource IDs.
Learn: Query parameters are optional and unordered. They are ideal for ?sort=name&limit=20 or ?active=true. Validate and parse types (Number, Boolean) in the controller before passing options to the service. Do not confuse req.query with req.params: /pastes/5 uses params for id 5; /pastes?sort=desc uses query for sort.

Supplementary examples

Pagination query params

const page = Math.max(1, Number(req.query.page) || 1);
const pageSize = Math.min(100, Number(req.query.pageSize) || 20);
const offset = (page - 1) * pageSize;

Pass query options to service

// GET /users/3/pastes?sort=desc
async function list(req, res, next) {
  const options = {
    userId: req.params.userId,
    sort: req.query.sort,
    limit: Number(req.query.limit) || 10,
  };
  const rows = await service.list(options);
  res.json({ data: rows });
}

Course example

// GET /pastes?sort=desc&limit=5
async function list(req, res, next) {
  const sort = req.query.sort || "asc";
  const limit = Number(req.query.limit) || 10;
  const pastes = await service.list({
    userId: req.params.userId,
    sort,
    limit,
  });
  res.json({ data: pastes });
}

Additional references & examples

← All Query and route parameters · Server Architecture / Routes