npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@localnerve/express-version-route

v2.0.0

Published

provides middleware to load controllers based on api versions

Downloads

308

Readme

express-version-route

Maintained fork of lirantal/express-version-route

Why the fork?

  • Simplified and updated
  • Dramatically reduced developer tool chain and attack surface

This npm package provides an Express middleware to load route controllers based on api versions.

Implementing API Versioning as simple as:

now any request would be handled with the appropriate route handler in accordance to request.version.

Usage

Create a map where the key is the version of the supported controller, and the value is a regular Express route function signature.

import versionRouter from '@localnerve/express-version-route';

const routesMap = new Map();
routesMap.set('1.0', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you version 1.0'});
});

Then, on the route which you wish to version, call the route function of this module with the map you created:

router.get('/test', versionRouter.route(routesMap));

If no route matches the version requested by a client then the next middleware in the chain will be called. To set a route fallback incase no version matches set a 'default' key on the routes map, for example:

routesMap.set('default', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you, this is the default route'});
});

If maximal possible version (for example to get the latest bugfix) is necessary, then please specify useMaxVersion: true in route function, then the maximal possible version will be returned for your request. For example for 1.0 request, the version 1.0.2 will be returned:

const routesMap = new Map();
routesMap.set('1.0.0', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you version 1.0.0'})
});
routesMap.set('1.0.2', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you version 1.0.2'})
});

router.get('/test', versionRouter.route(routesMap,{useMaxVersion: true}));

No Routes Matched Error

If no routes are matched, the versionRouter.route middleware throws a typed error RouteVersionUnmatchedError. The error class is exported via a named export:

import versionRouter, { RouteVersionUnmatchedError } from '@localnerve/express-version-route';

Usage with TypeScript

import versionRouter from '@localnerve/express-version-route'
import { Router, Handler } from 'express';

const router = Router();
const routesMap = new Map<string, Handler>();

routesMap.set('1.0', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you version 1.0'});
})

routesMap.set('default', (req, res, next) => {
  return res.status(200).json({'message': 'hello to you, this is the default route'});
})

router.get('/test', versionRouter.route(routesMap));

How it works

The Library

A requested version from the client must be available on the request object at req.version. You are encouraged to use this module's twin: express-version-request which is another simple Express middleware that populates req.version from the client's X-Api-Version header, Accept header, or from a query string (such as 'api-version=1.0.0')

The key for the routes versions you define can be a non-semver format, for example: 1.0 or just 1. Under the hood, expression-version-route uses the semver module to check if the version found on the request object at req.version matches the route.

Client-Server flow

  1. An API client will send a request to your API endpoint with an HTTP header that specifies the requested version of the API to use:
curl --header "X-Api-Version: 1.0.0" https://www.example.com/api/users
  1. The express-version-request library will parse the X-Api-Version and sets Express's req.version property to 1.0.0.
  2. The express-version-route library, when implemented like the usage example above will match the 1.0 route version because semver will match 1.0.0 to 1.0, and then reply with the JSON payload {'message': 'hello to you version 1.0'}.

Tests

npm test

Project linting:

npm run lint

On API Versioning...

An API versioning is a practice that enables services to evolve their APIs with new changes, signatures and the overall API contract without interrupting API consumers and forcing them to repeatedly make changes in order to keep in pace with changes to APIs.

Several methodologies exist to version your API:

  • URL: A request specifies the version for the resource: http://api.domain.com/api/v1/schools/3/students
  • Query String: A request specifies the resource in a query string: http://api.domain.com/api/schools/3/students?api-version=1
  • Custom HTTP Header: A request to a resource http://api.domain.com/api/schools/3/students with a custom HTTP header set in the request X-Api-Version: 1
  • MIME Type content negotiation: A request to a resource http://api.domain.com/api/schools/3/students with an Accept header that specifies the requested content and its version: Accept: application/vnd.ecma.app-v2+json

There is no strict rule on which methodology to follow and each has their own pros and cons. The RESTful approach is the semantic mime-type content negotiation, but a more pragmatic solution is the URL or custom HTTP header.

Why API Versioning at all ?

Upgrading APIs with some breaking change would lead to breaking existing products, services or even your own frontend web application which is dependent on your API contract. By implementing API versioning you can ensure that changes you make to your underlying API endpoints are not affecting systems that consume them, and using a new version of an API is an opt-in on the consumer. read more...

Alternative Node.js libraries

Several npm projects exist which provide similar API versioning capabilities to Express projects, and I have even contributed Pull Requests to some of them that provide fixes or extra functionality but unfortunately they all seem to be unmaintained, or buggy.

  • https://github.com/Prasanna-sr/express-routes-versioning
  • https://github.com/elliotttf/express-versioned-routes
  • https://github.com/biowink/express-route-versioning

Author

Liran Tal [email protected]

Maintainer

Alex Grant [email protected]