From e97eca05c00bb6a4ebc9f26cfcb4cf48b9aae048 Mon Sep 17 00:00:00 2001 From: "Gisa M. Caleb Pacifique" Date: Thu, 25 Apr 2024 06:41:53 +0200 Subject: [PATCH] Added a global error handler middleware --- src/index.ts | 8 ++++++++ src/middlewares/errorHandler.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/middlewares/errorHandler.ts diff --git a/src/index.ts b/src/index.ts index 66fbc0d..ac9c007 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ import dotenv from "dotenv"; import router from "./routes"; import { addDocumentation } from "./startups/docs"; +import {CustomError,errorHandler} from "./middlewares/errorHandler"; dotenv.config(); export const app = express(); @@ -12,11 +13,18 @@ app.use(express.json()); app.use(cors({ origin: "*" })); +app.all('*', (req: Request,res: Response,next) =>{ + const error = new CustomError(`Can't find ${req.originalUrl} on the server!`,404); + error.status = 'fail'; + next(error); +}) + addDocumentation(app); app.get("/api/v1", (req: Request, res: Response) => { res.send("Knights Ecommerce API"); }); app.use(router) +app.use(errorHandler); export const server = app.listen(port, () => { console.log(`[server]: Server is running at http://localhost:${port}`); }) diff --git a/src/middlewares/errorHandler.ts b/src/middlewares/errorHandler.ts new file mode 100644 index 0000000..e597542 --- /dev/null +++ b/src/middlewares/errorHandler.ts @@ -0,0 +1,30 @@ +import { Request, Response, NextFunction } from 'express'; + +class CustomError extends Error { + statusCode: number; + status: string; + + constructor(message: string, statusCode: number) { + super(message); + this.statusCode = statusCode; + this.status = `${statusCode}`.startsWith('4') ? 'fail' : 'error'; + Error.captureStackTrace(this, this.constructor); + } +} + +const errorHandler = ( + err: CustomError, + req: Request, + res: Response, + next: NextFunction +) => { + err.statusCode = err.statusCode || 500; + err.status = err.status || 'error'; + res.status(err.statusCode).json({ + status: err.statusCode, + message: err.message + }); + console.error(err.stack); +}; + +export { CustomError, errorHandler };