From 18efd445e566c6b7d1714bcc9bacf9511cab6b8d Mon Sep 17 00:00:00 2001 From: Azure Date: Sat, 20 Dec 2025 15:48:57 +0100 Subject: [PATCH] Added a better error handling --- errors/DefaultError.js | 19 +++++++++++++++++++ routes/register.js | 16 ++++++++++++---- server.js | 15 +++++++++++++++ services/register.js | 17 +++++------------ 4 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 errors/DefaultError.js diff --git a/errors/DefaultError.js b/errors/DefaultError.js new file mode 100644 index 0000000..a0c7893 --- /dev/null +++ b/errors/DefaultError.js @@ -0,0 +1,19 @@ +class DefaultError extends Error { + constructor(code, message, cause, name) { + super(message) + this.code = code + this.name = name || "DefaultError" + this.cause = cause || "Internal Server Error" + this.message = message || "Internal Server Error" + this.isOperational = true + } + + serialize() { + return { + code: this.code, + message: this.message + } + } +} + +module.exports = DefaultError \ No newline at end of file diff --git a/routes/register.js b/routes/register.js index 955fa3b..36d7b74 100644 --- a/routes/register.js +++ b/routes/register.js @@ -2,10 +2,18 @@ const express = require("express") const router = express.Router() const registerService = require("../services/register") -router.post("/", async (req, res) => { - const { email, username, password } = req.body - const registerResult = registerService.register({ email, username, password }) - return res.status(registerResult.code).json(registerResult) +router.post("/", async (req, res, next) => { + try { + const { email, username, password } = req.body + const registerResult = registerService.register({ email, username, password }) + return res.status(200).json({ + code: 200, + message: "User successfully registered", + data: registerResult + }) + } catch (error) { + next(error) + } }) module.exports = router \ No newline at end of file diff --git a/server.js b/server.js index 1ba0c94..69b033c 100644 --- a/server.js +++ b/server.js @@ -96,6 +96,21 @@ for (const route of routes) { } } +app.use((err, req, res, next) => { + const statusCode = err.statusCode || 500 + + logger.error(err.message, ["API", "red"]) + + if (typeof err.serialize === "function") { + return res.status(statusCode).json(err.serialize()) + } + + return res.status(500).json({ + status: "error", + message: "Internal Server Error" + }) +}) + app.listen(process.env.WEB_PORT || 3000, () => { logger.log(`Server listening at port : ${process.env.WEB_PORT || 3000}`, ["WEB", "yellow"]) }) \ No newline at end of file diff --git a/services/register.js b/services/register.js index b5e9534..6e0dea6 100644 --- a/services/register.js +++ b/services/register.js @@ -1,22 +1,15 @@ const crypto = require("node:crypto") +const DefaultError = require("../errors/DefaultError") function register({ email, username, password }) { if (true) { return { - code: 200, - message: "User successfully registered", - data: { - id: crypto.randomUUID(), - username: username, - email: email - } + id: crypto.randomUUID(), + username: username, + email: email } } else { - return { - code: 418, - error: "I'm a tea pot", - message: "Error occured", - } + throw new DefaultError(418, "I'm a teapot", "", "TeaPotExeception") } }