Invokes connect-like middleware if / unless routing criteria matches. Inspired on express-unless module.
- Advanced routes matching capabilities. Uses find-my-way or any compatible router to match the routes.
iff: execute middleware only if the routes matches. Ideal use case: API gateways (see: k-fastify-gateway)unless: execute middleware always unless the routes matches.- Arbitraty chaining of iff -> unless of vice-versa.
- Low overhead, crazy fast implementation.
How to extend any connect-like middleware:
const iu = require('middleware-if-unless')() const middleware = function (req, res, next) { res.body = 'hit' return next() } // extend middleware with iff/unless capabilities iu(middleware)Execute middleware unless routing restrictions matches:
const app = require('express')() app.use(middleware.unless([ '/not/allowed/to/hit' ])) ...In this example, all requests except [GET] /not/allowed/to/hit will cause the middleware to be executed.
Execute middleware only if routing restrictions matches:
const app = require('express')() app.use(middleware.iff([ { methods: ['POST', 'DELETE', 'PUT', 'PATCH'], url: '/tasks/:id' } ])) ...In this example, only a [POST|DELETE|PUT|PATCH] /tasks/:id request will cause the middleware to be executed.
You can optionally chain iff -> unless or vice-versa:
app.use(middleware .iff(req => req.url.startsWith('/pets')) // 4 check .iff([ // 3 check '/pets/*', '/pets/:id/*' ]).unless([ // 2 check '/pets/:id/owners', { url: '/pets/:id', methods: ['DELETE'] } ]).unless(req => req.url.endsWith('.js')) // 1 check )const iu = require('middleware-if-unless')( // optional router configuration: // https://www.npmjs.com/package/find-my-way#findmywayoptions { } , // optional router factory: // allows to override find-my-way as default router function(opts){} )Both methods share the same configuration format:
middleware.iff(req => req.url.startsWith('/pets'))middleware.iff([ '/login', // if string is passed, the GET method is inferred { methods: ['DELETE', 'POST', '...'], url: '/tasks/:id/*' } ])middleware.unless({ endpoints: [ '/login', // if string is passed, the GET method is inferred { methods: ['DELETE', 'POST', '...'], url: '/tasks/:id/*' } ]})Optionally, you can also restrict your middleware execution to specific versions using the Accept-Version header:
The
versionvalue should follow the semver specification.
middleware.iff({ endpoints: [ { methods: ['GET'], url: '/tasks/:id', version: '2.0.0' } ]})In the example, a GET /tasks/:id request will only execute the middleware if the Accept-Version header matches 2.0.0. For example:
- Accept-Version=2.0.0
- Accept-Version=2.x
- Accept-Version=2.0.x