Skip to content

Commit 7a44411

Browse files
committed
🚧 WIP: Error Handling
1 parent 68aec8c commit 7a44411

File tree

5 files changed

+67
-2
lines changed

5 files changed

+67
-2
lines changed

src/app.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import cors from "cors";
55
import { customRequest } from "./types/customDefinition";
66
import { deserializeUser } from "./middleware";
77
import appRouter from "./routes/v1";
8+
import { errorHandler } from "./middleware/error";
89

910
// Create Express server
1011
const app = express();
@@ -50,5 +51,6 @@ app.patch("/api/sync", async (req, res) => {
5051
return res.status(400).json({ errorMsg: msg, error: true });
5152
}
5253
});
53-
54+
// middleware to handle error
55+
app.use(errorHandler);
5456
export default app;

src/middleware/error.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { customError } from "customDefinition";
2+
import { NextFunction, Request, Response } from "express";
3+
import { ApiError } from "../util/ApiError";
4+
5+
/**
6+
* Error Handler Middleware
7+
* @param error
8+
* @param req
9+
* @param res
10+
* @param next
11+
*/
12+
export const errorHandler = (
13+
error: customError,
14+
req: Request,
15+
res: Response,
16+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
17+
next: NextFunction
18+
): void => {
19+
let err = error;
20+
21+
if (!(error instanceof ApiError)) {
22+
const statusCode = 500;
23+
const message = error.message || "Internal server error";
24+
err = new ApiError(statusCode, message);
25+
}
26+
27+
const { statusCode, message } = err;
28+
29+
res.locals.errorMessage = err.message;
30+
31+
const response = {
32+
code: statusCode,
33+
message,
34+
};
35+
36+
res.status(statusCode).send(response);
37+
};

src/types/customDefinition.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
import { Request } from "express";
1+
import { NextFunction, Request, Response } from "express";
22

33
export interface customRequest extends Request {
44
user: any;
55
}
6+
7+
export interface customError extends Error {
8+
statusCode: number;
9+
}
10+
11+
export type ControllerFunction = (
12+
req: Request,
13+
res: Response,
14+
next: NextFunction
15+
) => void;

src/util/ApiError.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export class ApiError extends Error {
2+
statusCode: number;
3+
4+
constructor(statusCode: number, message: string) {
5+
super(message);
6+
this.statusCode = statusCode;
7+
}
8+
}

src/util/handleError.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { ControllerFunction } from "customDefinition";
2+
import { NextFunction, Request, Response } from "express";
3+
4+
export function handleError(fn: ControllerFunction) {
5+
return (req: Request, res: Response, next: NextFunction): void => {
6+
Promise.resolve(fn(req, res, next)).catch(err => next(err));
7+
};
8+
}

0 commit comments

Comments
 (0)