All files express-problem-middleware.ts

100% Statements 13/13
84.62% Branches 11/13
100% Functions 2/2
100% Lines 13/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 553x     3x             3x       9x           9x   9x 1x         1x       8x 2x                   2x         2x     6x      
import { INTERNAL_SERVER_ERROR } from 'http-status-codes';
import { NextFunction, Request, Response } from 'express';
import { ErrorRequestHandler } from 'express-serve-static-core';
import { ApiProblem } from './api-problem';
 
type MiddlewareOptionsType = { stackTrace?: boolean; contentType?: string };
type ExpressProblemMiddlewareType = (
  options?: MiddlewareOptionsType,
) => ErrorRequestHandler;
 
export const ExpressProblemMiddleware: ExpressProblemMiddlewareType = function(
  options: MiddlewareOptionsType = {},
): ErrorRequestHandler {
  // Merge the options with defaults
  options = {
    stackTrace: true,
    contentType: 'application/problem+json',
    ...options,
  };
 
  return function(err: any, req: Request, res: Response, next: NextFunction) {
    // For API problems, just respond with the error
    if (err instanceof ApiProblem) {
      res
        .status(err.status)
        .header('Content-Type', options.contentType)
        .json(JSON.stringify(err));
 
      return;
    }
 
    // For Exceptions, create internal error exception
    if (err instanceof Error) {
      const error: ApiProblem = new ApiProblem({
        status: INTERNAL_SERVER_ERROR,
        detail: err.message,
        additional: options.stackTrace
          ? {
              stack: err?.stack || undefined,
            }
          : undefined,
      });
 
      res
        .status(error.status)
        .header('Content-Type', options.contentType)
        .json(JSON.stringify(error));
 
      return;
    }
 
    next();
  };
};