From 8bf18267d1d203f78f972331a50c0c3deaa0f9e8 Mon Sep 17 00:00:00 2001 From: Stephan <57194608+stephan418@users.noreply.github.com> Date: Thu, 28 Apr 2022 12:04:36 +0200 Subject: [PATCH] Fix: Add winston; And: Add custom error handlers + addCustomHandler() + removeCustomHandler() --- package.json | 3 ++- src/Middleware/error/handler.ts | 43 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9bbdaf3..e51d789 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "express-async-errors": "^3.1.1", "jsonwebtoken": "^8.5.1", "nodemailer": "^6.7.0", - "redis": "^3.1.2" + "redis": "^3.1.2", + "winston": "^3.7.2" }, "devDependencies": { "@types/chai": "^4.2.22", diff --git a/src/Middleware/error/handler.ts b/src/Middleware/error/handler.ts index 33f3448..fbfe846 100644 --- a/src/Middleware/error/handler.ts +++ b/src/Middleware/error/handler.ts @@ -5,7 +5,34 @@ import logger from "./logger"; const env = process.env.NODE_ENV || "production"; +type ErrorHandler = (err: any, req: Request, res: Response) => boolean; + +const customHandlers: ErrorHandler[] = []; + +export function addCustomHandler(handler: ErrorHandler) { + customHandlers.push(handler); +} + +export function removeCustomHandler(handler: ErrorHandler): Boolean { + const index = customHandlers.findIndex((h) => h === handler); + + if (index < 0) { + return false; + } + + customHandlers.splice(index); + + return true; +} + export default function defaultErrorHandler(err: any, req: Request, res: Response, next: NextFunction) { + for (const handler of customHandlers) { + // Run custom handler + if (handler(err, req, res)) { + return; + } + } + if (ForwardableError.isForwardableError(err)) { return res.status(err.status).json({ type: "error", @@ -36,4 +63,20 @@ export default function defaultErrorHandler(err: any, req: Request, res: Respons }, }); } + + logger.error("--- Unhandled error ---"); + logger.error(err); + + return res.status(err.status).json({ + type: "error", + payload: { + message: err.message, + ...(env === "development" + ? { + notice: "This error was not caught by any handler, please add handling!", + stack: err.stack, + } + : {}), + }, + }); }