From 28926d1d30f2929e793de036b7f961c5b910ff1a Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 3 Jan 2025 08:43:54 +0100 Subject: [PATCH 1/3] chore: add middleware for error handling --- src/app.ts | 3 ++- src/middleware/errorHandler.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/middleware/errorHandler.ts diff --git a/src/app.ts b/src/app.ts index 4d02f79e..b8a1a759 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,6 +2,7 @@ import express from "express"; import { unknownEndpointHandler } from "@/src/middleware/middleware"; import { requestLogger } from "@/src/middleware/morgenMiddleware"; +import { errorHandler } from "@/src/middleware/errorHandler"; import { apiRouter } from "@/src/routes/api"; //import { testRouter } from "@/src/routes/test"; @@ -20,7 +21,7 @@ app.use(bodyParser.raw()); app.use(express.json()); app.use(bodyParser.text()); app.use(requestLogger); -//app.use(requestLogger); +app.use(errorHandler); app.use("/api", apiRouter); //app.use("/test", testRouter); diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts new file mode 100644 index 00000000..f4669e1f --- /dev/null +++ b/src/middleware/errorHandler.ts @@ -0,0 +1,14 @@ +import { NextFunction, Request, Response } from "express"; +import { logger } from "../utils/logger"; + +export const errorHandler = (err: Error, req: Request, res: Response, _next: NextFunction): void => { + if (err.stack) { + const stackArr = err.stack.split("\n"); + stackArr[0] += ` while processing ${req.path} request`; + logger.error(stackArr.join("\n")); + res.status(500).end(); + } else { + logger.error(`uncaught error while processing ${req.path} request: ${err.message}`); + res.status(500).end(); + } +}; -- 2.47.2 From dd6b7ee4ef588f966e549b09a939277f3d9c50a7 Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 3 Jan 2025 08:44:19 +0100 Subject: [PATCH 2/3] fix: handle 'Invalid accountId-nonce pair' error for all controllers --- src/controllers/api/inventoryController.ts | 8 +------- src/middleware/errorHandler.ts | 4 +++- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index f38fe0ec..747df001 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -18,13 +18,7 @@ import { import { handleSubsumeCompletion } from "./infestedFoundryController"; export const inventoryController: RequestHandler = async (request, response) => { - let account; - try { - account = await getAccountForRequest(request); - } catch (e) { - response.status(400).send("Log-in expired"); - return; - } + const account = await getAccountForRequest(request); const inventory = await Inventory.findOne({ accountOwnerId: account._id.toString() }) .populate<{ LoadOutPresets: ILoadoutDatabase }>("LoadOutPresets") diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts index f4669e1f..d5b83950 100644 --- a/src/middleware/errorHandler.ts +++ b/src/middleware/errorHandler.ts @@ -2,7 +2,9 @@ import { NextFunction, Request, Response } from "express"; import { logger } from "../utils/logger"; export const errorHandler = (err: Error, req: Request, res: Response, _next: NextFunction): void => { - if (err.stack) { + if (err.message == "Invalid accountId-nonce pair") { + res.status(400).json("Log-in expired"); + } else if (err.stack) { const stackArr = err.stack.split("\n"); stackArr[0] += ` while processing ${req.path} request`; logger.error(stackArr.join("\n")); -- 2.47.2 From f0be16b0237db0dfc18340215f84edd904be4f85 Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 3 Jan 2025 08:48:40 +0100 Subject: [PATCH 3/3] chore: fix duplication in error paths --- src/controllers/api/claimCompletedRecipeController.ts | 3 --- src/controllers/api/getShipController.ts | 4 +--- src/controllers/api/startRecipeController.ts | 1 - src/services/itemDataService.ts | 3 --- src/services/loadoutService.ts | 4 +--- src/services/personalRoomsService.ts | 4 +--- src/services/shipCustomizationsService.ts | 4 ---- src/services/shipService.ts | 3 --- 8 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index 237a5b87..c0d2fdc0 100644 --- a/src/controllers/api/claimCompletedRecipeController.ts +++ b/src/controllers/api/claimCompletedRecipeController.ts @@ -30,13 +30,11 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = recipe => recipe._id?.toString() === claimCompletedRecipeRequest.RecipeIds[0].$oid ); if (!pendingRecipe) { - logger.error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`); throw new Error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`); } //check recipe is indeed ready to be completed // if (pendingRecipe.CompletionDate > new Date()) { - // logger.error(`recipe ${pendingRecipe._id} is not ready to be completed`); // throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`); // } @@ -45,7 +43,6 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = const recipe = getRecipe(pendingRecipe.ItemType); if (!recipe) { - logger.error(`no completed item found for recipe ${pendingRecipe._id.toString()}`); throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`); } diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index 4dad54a8..3ce7a6c3 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -5,7 +5,6 @@ import { getAccountIdForRequest } from "@/src/services/loginService"; import { getPersonalRooms } from "@/src/services/personalRoomsService"; import { getShip } from "@/src/services/shipService"; import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; -import { logger } from "@/src/utils/logger"; import { toOid } from "@/src/helpers/inventoryHelpers"; import { IGetShipResponse } from "@/src/types/shipTypes"; import { IPersonalRooms } from "@/src/types/personalRoomsTypes"; @@ -44,8 +43,7 @@ export const getLoadout = async (accountId: string) => { const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); if (!loadout) { - logger.error(`loadout not found for account ${accountId}`); - throw new Error("loadout not found"); + throw new Error(`loadout not found for account ${accountId}`); } return loadout; diff --git a/src/controllers/api/startRecipeController.ts b/src/controllers/api/startRecipeController.ts index 20693509..83501874 100644 --- a/src/controllers/api/startRecipeController.ts +++ b/src/controllers/api/startRecipeController.ts @@ -22,7 +22,6 @@ export const startRecipeController: RequestHandler = async (req, res) => { const recipe = getRecipe(recipeName); if (!recipe) { - logger.error(`unknown recipe ${recipeName}`); throw new Error(`unknown recipe ${recipeName}`); } diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index f45f759b..df3e2b78 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -1,5 +1,4 @@ import { getIndexAfter } from "@/src/helpers/stringHelpers"; -import { logger } from "@/src/utils/logger"; import { dict_de, dict_en, @@ -54,7 +53,6 @@ export const getWeaponType = (weaponName: string): WeaponTypeInternal => { const weaponType = weaponInfo.productCategory; if (!weaponType) { - logger.error(`unknown weapon category for item ${weaponName}`); throw new Error(`unknown weapon category for item ${weaponName}`); } @@ -83,7 +81,6 @@ export const getItemCategoryByUniqueName = (uniqueName: string): string => { const index = getIndexAfter(uniqueName, splitWord); if (index === -1) { - logger.error(`error parsing item category ${uniqueName}`); throw new Error(`error parsing item category ${uniqueName}`); } const category = uniqueName.substring(index).split("/")[0]; diff --git a/src/services/loadoutService.ts b/src/services/loadoutService.ts index 37f91612..f9c385c5 100644 --- a/src/services/loadoutService.ts +++ b/src/services/loadoutService.ts @@ -1,12 +1,10 @@ import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; -import { logger } from "@/src/utils/logger"; export const getLoadout = async (accountId: string) => { const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); if (!loadout) { - logger.error(`loadout not found for account ${accountId}`); - throw new Error("loadout not found"); + throw new Error(`loadout not found for account ${accountId}`); } return loadout; diff --git a/src/services/personalRoomsService.ts b/src/services/personalRoomsService.ts index c2d0b629..1392ce46 100644 --- a/src/services/personalRoomsService.ts +++ b/src/services/personalRoomsService.ts @@ -1,12 +1,10 @@ import { PersonalRooms } from "@/src/models/personalRoomsModel"; -import { logger } from "@/src/utils/logger"; export const getPersonalRooms = async (accountId: string) => { const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId }); if (!personalRooms) { - logger.error(`personal rooms not found for account ${accountId}`); - throw new Error("personal rooms not found"); + throw new Error(`personal rooms not found for account ${accountId}`); } return personalRooms; }; diff --git a/src/services/shipCustomizationsService.ts b/src/services/shipCustomizationsService.ts index ddf70f59..26aef04e 100644 --- a/src/services/shipCustomizationsService.ts +++ b/src/services/shipCustomizationsService.ts @@ -47,7 +47,6 @@ export const handleSetShipDecorations = async ( const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room); if (!roomToPlaceIn) { - logger.error("room not found"); throw new Error("room not found"); } @@ -59,7 +58,6 @@ export const handleSetShipDecorations = async ( ); if (existingDecorationIndex === -1) { - logger.error("decoration to be moved not found"); throw new Error("decoration to be moved not found"); } @@ -143,13 +141,11 @@ export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlaced const room = personalRooms.Ship.Rooms.find(room => room.Name === req.Room); if (!room) { - logger.error("room not found"); throw new Error("room not found"); } const placedDeco = room.PlacedDecos?.find(x => x._id.toString() == req.DecoId); if (!placedDeco) { - logger.error("deco not found"); throw new Error("deco not found"); } diff --git a/src/services/shipService.ts b/src/services/shipService.ts index f654721d..0925a409 100644 --- a/src/services/shipService.ts +++ b/src/services/shipService.ts @@ -1,6 +1,5 @@ import { Ship } from "@/src/models/shipModel"; import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; -import { logger } from "@/src/utils/logger"; import { Types } from "mongoose"; export const createShip = async ( @@ -26,7 +25,6 @@ export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = " const ship = await Ship.findOne({ _id: shipId }, fieldSelection); if (!ship) { - logger.error(`error finding a ship with id ${shipId.toString()}`); throw new Error(`error finding a ship with id ${shipId.toString()}`); } @@ -39,7 +37,6 @@ export const getShipLean = async (shipOwnerId: string) => { }>("LoadOutInventory.LoadOutPresets"); if (!ship) { - logger.error(`error finding a ship for account ${shipOwnerId}`); throw new Error(`error finding a ship for account ${shipOwnerId}`); } -- 2.47.2