API versioning — support multiple API versions.
1const express = require("express");23class APIVersioning {4 constructor() {5 this.versions = new Map();6 }78 register(version, router) {9 this.versions.set(version, router);10 }1112 middleware() {13 return (req, res, next) => {14 const version = req.headers["api-version"] ||15 req.query.version ||16 this.extractFromPath(req.path);1718 const router = this.versions.get(version);19 if (!router) {20 return res.status(400).json({21 error: `API version ${version} not supported`,22 supported: Array.from(this.versions.keys()),23 });24 }2526 req.apiVersion = version;27 router(req, res, next);28 };29 }3031 extractFromPath(path) {32 const match = path.match(/\/v(\d+)\//);33 return match ? `v${match[1]}` : "v1";34 }35}3637// Version-specific routers38const v1Router = express.Router();39v1Router.get("/users", (req, res) => {40 res.json({ users: [], version: "v1" });41});4243const v2Router = express.Router();44v2Router.get("/users", (req, res) => {45 res.json({ data: [], meta: {}, version: "v2" });46});4748// Setup49const api = new APIVersioning();50api.register("v1", v1Router);51api.register("v2", v2Router);5253app.use("/api", api.middleware());