A general purpose find-my-way custom constraint strategy.
Tested for Fastify ✅!
This module let you to drive the incoming HTTP request into a route based on the header's strict content. Doing so, if a request has a specific string header, it can reach a route hide behind a constraint. Go to the Usage section to get a complete overview of this feature!
npm install header-constraint-strategy
Here all the constraint types you can define with this module!
This setup shows you all the settings header-constraint-strategy provides to you.
const headerConstraintStrategy = require('header-constraint-strategy')
const Fastify = require('fastify')
// STEP 1: setup the constraints into your fastify instance
const app = Fastify({
constraints: {
// basic usage
foo: headerConstraintStrategy('foo'),
// strict usage
mustBeIn: headerConstraintStrategy({ header: 'mustBeIn', mustMatchWhenDerived: true }),
// custom header usage
appOption: headerConstraintStrategy({ name: 'appOption', header: 'x-my-app' })
}
})
// STEP 2: use the constraint where you need them
app.get('/', {
handler: reply('no constraint')
})
app.get('/', {
handler: reply('foo'),
constraints: {
foo: 'bar'
}
})
app.get('/', {
handler: reply('mustBeIn'),
constraints: {
mustBeIn: '123'
}
})
app.get('/', {
handler: reply('appOption'),
constraints: {
appOption: 'ABC'
}
})
app.get('/', {
handler: reply('mustBeIn and appOption'),
constraints: {
mustBeIn: '123',
appOption: 'ABC'
}
})
app.listen(80)The routes can be reached via an HTTP request with these headers.
| # | foo header |
mustBeIn header |
x-my-app header |
response |
|---|---|---|---|---|
| 1 | - | - | - | 200 - no constraint |
| 2 | bar |
- | - | 200 - foo |
| 3 | hello |
- | - | 200 - no constraint |
| 4 | - | 123 |
- | 200 - mustBeIn |
| 5 | - | 456 |
- | 404 |
| 6 | - | - | ABC |
200 - appOption |
| 7 | - | 123 |
ABC |
200 - mustBeIn and appOption |
| 8 | - | ops |
ABC |
404 |
| 9 | bar |
123 |
ABC |
200 - mustBeIn and appOption |
| 10 | bar |
ops |
ABC |
404 |
- When the is not headers that meets the constraint, the route without constraint will be used if set. Otherwise 404
- The
fooconstraint is matched - The
fooconstraint is not matched so the route without constraint is used - The
mustBeInconstraint is matched - Like the 4), but this time the route without constraint is no used because of the flag
mustMatchWhenDerived: true - The
appOptionconstraint is matched - Multiple constraint matches
- Regardless the
appOptionconstraint is matched, themustBeInconstraint withmustMatchWhenDerived=trueforces the handler to be used - When there are multiple matches (the route with
fooand route withmustBeInandappOption), the route with more fulfilled constraint wins! - As the 8), the
mustBeInconstraint is not fulfilled
You can pass the following options during the registration:
| Option | Default | Description |
|---|---|---|
name |
as the header if not set | The name of the JSON property that you will set in the route's constraints option |
header |
as the name if not set | The HTTP header where read the input to match the constraint |
mustMatchWhenDerived |
false |
Define if the same route without constraint must be evaluated for the routing. You can translate it as: is this constraint mandatory? |
Copyright Manuel Spigolon, Licensed under MIT.