Skip to content

Instantly share code, notes, and snippets.

@Dugo03
Created September 21, 2018 19:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dugo03/63a141f55cba118a94da6c779d3234e9 to your computer and use it in GitHub Desktop.
Save Dugo03/63a141f55cba118a94da6c779d3234e9 to your computer and use it in GitHub Desktop.
Express API version - /v1, /v2, etc..
const latest = 5;
module.exports = (req, res, next) => {
if (!req.params.version.match(/^v\d+$/)) { // /v1 or /v2
return res.sendStatus(404);
}
req.version = parseInt(req.params.version.substr(1)); // 1 or 2
if (!req.version || req.version > latest) {
return res.sendStatus(404);
}
next();
};
module.exports = (routeMap) => (req, res, next) => {
const key = Object.keys(routeMap)
.filter(version => version <= req.version)
.pop();
const route = routeMap[key];
return route(req, res, next);
};
@Dugo03
Copy link
Author

Dugo03 commented Sep 21, 2018

Usage example:

  • index.js
...
app.use('/:version', router)
  • router.js
...
const router = express.Router({ mergeParams: true });
const versionRouter = require('./versionRouter')
const versionMiddleware = require('./versionMiddleware');

router.use(versionMiddleware);

router.get('/hello', versionRouter({
  1: (req, res, next) => {
    return res.status(200).json({'message': 'hello 1'})
  },
  2: (req, res, next) => {
    return res.status(200).json({'message': 'hello 2 and 3'})
  },
  4: (req, res, next) => {
    return res.status(200).json({'message': 'hello 4 and higher'})
  }
}));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment