javascript 52 lines · 10 steps

Versioning an API with Express Routers

Two independent Express Routers hold v1 and v2 handlers, then mount under a parent router for clean URL versioning.

Explained by highlit
1const express = require('express');
2 
3const v1 = express.Router();
4 
5v1.get('/users', async (req, res, next) => {
6 try {
7 const users = await req.db.users.findAll();
8 res.json(users.map(({ id, name }) => ({ id, name })));
9 } catch (err) {
10 next(err);
11 }
12});
13 
14v1.post('/users', async (req, res, next) => {
15 try {
16 const user = await req.db.users.create({ name: req.body.name });
17 res.status(201).json({ id: user.id, name: user.name });
18 } catch (err) {
19 next(err);
20 }
21});
22 
23const v2 = express.Router();
24 
25v2.get('/users', async (req, res, next) => {
26 try {
27 const page = Number(req.query.page) || 1;
28 const perPage = 25;
29 const { rows, count } = await req.db.users.findAndPaginate({ page, perPage });
30 res.json({
31 data: rows.map(({ id, name, email }) => ({ id, name, email })),
32 meta: { page, perPage, total: count },
33 });
34 } catch (err) {
35 next(err);
36 }
37});
38 
39v2.post('/users', validateUserPayload, async (req, res, next) => {
40 try {
41 const user = await req.db.users.create(req.body);
42 res.status(201).json({ id: user.id, name: user.name, email: user.email });
43 } catch (err) {
44 next(err);
45 }
46});
47 
48const api = express.Router();
49api.use('/v1', v1);
50api.use('/v2', v2);
51 
52module.exports = api;
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1Separate Router instances let you evolve an API version without touching older ones.
  2. 2Forwarding caught errors to next(err) keeps async route handlers from crashing the process.
  3. 3Mounting routers under path prefixes turns version names into a single composition step.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Versioning an API with Express Routers — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code