HTTP error handler middleware for the middy framework, the stylish Node.js middleware engine for AWS Lambda
Automatically handles any uncaught errors and creates a proper HTTP response
for them (using the message and the status code provided by the error object). We recommend generating these HTTP errors with the npm module http-errors
.
This middleware should be set as the last error handler unless you also want to register the http-reponse-serializer
. If so, this middleware should come second-last and the http-response-serializer
should come last.
This is an alternative to standard Middy error handler with the following differences:
- it always returns JSON object and not text
- it handles any uncaught error, not just the ones with
statusCode
andmessage
To install this middleware you can use NPM:
npm install --save @schibsted/middy-error-handler
logger
(defaults toconsole
) - a logging function that is invoked with the current error as an argument. You can passfalse
if you don't want the logging to happen.level
(defaults toerror
) - log level to use for the error log entryexposeStackTrace
(defaults tofalse
) - iftrue
, the stack trace will be exposed in the response bodyfilter
(function, defaults to always returningtrue
) - a function that is invoked with the current error as an argument. If it returnstrue
, the error is logged and its stack trace returned as long asexposeStackTrace
is also true, otherwise it is not.
const middy = require('@middy/core');
const createError = require('http-errors');
const errorHandler = require('@schibsted/middy-error-handler');
const handler = middy(() => {
throw new createError.ServiceUnavailable('Service not available');
});
handler.use(errorHandler({exposeStackTrace: true}));
handler({}, {}).then((response) => {
console.log(response);
// {
// statusCode: 503,
// body: '{"statusCode":503,"message":"Service not available","stack":"..."}'
// stack: '...'
// }
});
const middy = require('@middy/core');
const createError = require('http-errors');
const errorHandler = require('@schibsted/middy-error-handler');
const { LambdaLog } = require('lambda-log');
const logger = new LambdaLog({
tags: ['foobar'],
});
const handler = middy(() => {
throw new createError.ServiceUnavailable('Service not available');
});
handler.use(errorHandler({
filter: (err) => err.statusCode !== 404, // don't log 404 errors, they happen a lot
logger
}));
handler({}, {}).then((response) => {
// same + also executes logger.error function
console.log(response);
// {
// statusCode: 503,
// body: '{"statusCode":503,"message":"Service not available","stack":"..."}'
// stack: '...'
// }
});
Everyone is very welcome to contribute to this repository. Feel free to raise issues or to submit Pull Requests.