mirror of
https://github.com/detleph/server.git
synced 2026-09-04 08:36:06 +02:00
Add basic error handling
+ Add express-async-errors package to handle async errors + Add ForwaradableError class (Base class for all project-specific errors) + Add defaultErrorHandler middleware which handles errors and sends info to the client
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
export default class ForwardableError extends Error {
|
||||
// If in different context
|
||||
private readonly __id = "CUSTOM_ERROR";
|
||||
|
||||
public readonly status: number;
|
||||
|
||||
constructor(status: number, message: string) {
|
||||
super(message);
|
||||
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
static isForwardableError(error: any): error is ForwardableError {
|
||||
return error.__id === "CUSTOM_ERROR";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import { PrismaClientUnknownRequestError } from "@prisma/client/runtime";
|
||||
import { NextFunction, Request, Response } from "express";
|
||||
import ForwardableError from "./ForwardableError";
|
||||
|
||||
const env = process.env.NODE_ENV || "production";
|
||||
|
||||
export default function defaultErrorHandler(err: any, req: Request, res: Response, next: NextFunction) {
|
||||
if (ForwardableError.isForwardableError(err)) {
|
||||
return res.status(err.status).json({
|
||||
type: "error",
|
||||
payload: {
|
||||
message: err.message,
|
||||
...(env === "development"
|
||||
? {
|
||||
stack: err.stack,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (err instanceof PrismaClientUnknownRequestError) {
|
||||
return res.status(404).json({
|
||||
type: "error",
|
||||
payload: {
|
||||
message: "An unknown error occured. This could be due to malformed IDs",
|
||||
...(env === "development"
|
||||
? {
|
||||
prisma: err.message,
|
||||
stack: err.stack,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,10 @@ import argon2 from "argon2";
|
||||
import adminRouter from "./Routes/admin.routes";
|
||||
import organisationRouter from "./Routes/organisation.routes";
|
||||
import groupRouter from "./Routes/group.routes";
|
||||
import defaultErrorHandler from "./Middleware/error/handler";
|
||||
|
||||
// Set up async error handling
|
||||
require("express-async-errors");
|
||||
|
||||
require("dotenv").config(); // Load dotenv config
|
||||
|
||||
@@ -52,6 +56,9 @@ async function main() {
|
||||
|
||||
app.use("/api/groups", groupRouter);
|
||||
|
||||
// Error handling
|
||||
app.use(defaultErrorHandler);
|
||||
|
||||
app.listen(process.env.PORT, () => {
|
||||
console.log(`Listening on Port: ${process.env.PORT}`);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user