@azure-functions-middlewares/core
v1.1.0
Published
The most complete middleware solution for ⚡ Azure Functions.
Downloads
7
Readme
azure-functions-middlewares
The most complete middleware solution for ⚡ Azure Functions.
Features
- Async/await middleware support
- Cascade error capture (a.k.a. "catch middleware")
New!
Execution order customization (in three phases)New!
Conditional middlewaresNew!
Middleware execution prevention (a.k.a. "stop signal")
How to use
Simplest usage
Install latest core version at NPM
$ npm install --save @azure-functions-middlewares/core
Listen to the cascade exporting it as the function entry point:
const FunctionCascade = require('@azure-functions-middlewares/core');
module.exports = new FunctionCascade()
.use(async (context) => {
context.res.body = { message: 'My first middleware!' };
})
.listen();
Tips!
- Always call
listen()
at the end of cascade - Always use async functions as middlewares. This cascade module doesn't supports sync functions anymore, we are at 21th century.
- Do not return anything inside your middleware function, unless you want to throw an error. Always use
context.res
to output what you need.
Capturing errors
Errors thrown or anything returned by a middleware will stop the cascade execution and will call cascade's catchFunction
.
A default catchFunction
is set to log the error at Azure Function's context and to return a HTTP 500 status.
If you want to catch function, use the catch()
method:
const FunctionCascade = require('@azure-functions-middlewares/core');
const app = new FunctionCascade();
// app.use(...); // middlewares
app.catch((context, error) => {
context.res.status = 404;
context.res.headers['X-Message'] = error;
});
module.exports = app.listen();
Customizing execution order
This module executes the middleware cascade in three phases. You can customize the execution phase of your middleware by passing a phase
argument to use()
or useIf()
methods:
app.use((context) => {
context.log('This will be executed at the last phase');
}, app.Phases.POST_PROCESSING);
app.use((context) => {
context.log('This will be executed at the first phase');
}, app.Phases.PRE_PROCESSING);
app.use((context) => {
context.log('This will be executed at the second phase');
});
Phases constants to use as phase argument are exposed into cascade's property Phases
:
app.Phases.PRE_PROCESSING => first phase
app.Phases.MAIN => second phase
app.Phases.POST_PROCESSING => last phase
Conditional middlewares
You can conditionally execute a middleware by passing an evaluation function to the useIf
method.
Example:
const isPostRequest = (context) => context.req.method === 'POST';
app.useIf(isPostRequest, (context) => {
context.log('This will be executed only if is a HTTP POST');
});
Stoping the cascade execution
You can stop the cascade execution at any time by returning the second middleware argument, STOP_SIGNAL
.
Example:
app.useIf((context, STOP_SIGNAL) => {
if (!req.query.access_token) {
context.res.status = 401;
return STOP_SIGNAL;
}
});