返回提交历史
Modified
src/app.ts
+2
-1
Modified
src/controllers/api/claimCompletedRecipeController.ts
+0
-3
Modified
src/controllers/api/getShipController.ts
+1
-3
Modified
src/controllers/api/inventoryController.ts
+1
-7
Modified
src/controllers/api/startRecipeController.ts
+0
-1
Added
src/middleware/errorHandler.ts
+16
-0
Modified
src/services/itemDataService.ts
+0
-3
Modified
src/services/loadoutService.ts
+1
-3
Modified
src/services/personalRoomsService.ts
+1
-3
Modified
src/services/shipCustomizationsService.ts
+0
-4
Modified
src/services/shipService.ts
+0
-3
XFEstudio/SpaceNinjaServer
chore: add middleware for error handling (#695)
4756f54f
代码差异
11 个文件
+22
-31
@@ -2,6 +2,7 @@ import express from "express";
2
2
3
3
import { unknownEndpointHandler } from "@/src/middleware/middleware";
4
4
import { requestLogger } from "@/src/middleware/morgenMiddleware";
5
import { errorHandler } from "@/src/middleware/errorHandler";
5
6
6
7
import { apiRouter } from "@/src/routes/api";
7
8
//import { testRouter } from "@/src/routes/test";
@@ -20,7 +21,7 @@ app.use(bodyParser.raw());
20
21
app.use(express.json());
21
22
app.use(bodyParser.text());
22
23
app.use(requestLogger);
23
//app.use(requestLogger);
24
app.use(errorHandler);
24
25
25
26
app.use("/api", apiRouter);
26
27
//app.use("/test", testRouter);
@@ -30,13 +30,11 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
30
30
recipe => recipe._id?.toString() === claimCompletedRecipeRequest.RecipeIds[0].$oid
31
31
);
32
32
if (!pendingRecipe) {
33
logger.error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`);
34
33
throw new Error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`);
35
34
}
36
35
37
36
//check recipe is indeed ready to be completed
38
37
// if (pendingRecipe.CompletionDate > new Date()) {
39
// logger.error(`recipe ${pendingRecipe._id} is not ready to be completed`);
40
38
// throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`);
41
39
// }
42
40
@@ -45,7 +43,6 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
45
43
46
44
const recipe = getRecipe(pendingRecipe.ItemType);
47
45
if (!recipe) {
48
logger.error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
49
46
throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
50
47
}
51
48
@@ -5,7 +5,6 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
5
5
import { getPersonalRooms } from "@/src/services/personalRoomsService";
6
6
import { getShip } from "@/src/services/shipService";
7
7
import { Loadout } from "@/src/models/inventoryModels/loadoutModel";
8
import { logger } from "@/src/utils/logger";
9
8
import { toOid } from "@/src/helpers/inventoryHelpers";
10
9
import { IGetShipResponse } from "@/src/types/shipTypes";
11
10
import { IPersonalRooms } from "@/src/types/personalRoomsTypes";
@@ -44,8 +43,7 @@ export const getLoadout = async (accountId: string) => {
44
43
const loadout = await Loadout.findOne({ loadoutOwnerId: accountId });
45
44
46
45
if (!loadout) {
47
logger.error(`loadout not found for account ${accountId}`);
48
throw new Error("loadout not found");
46
throw new Error(`loadout not found for account ${accountId}`);
49
47
}
50
48
51
49
return loadout;
@@ -17,13 +17,7 @@ import {
17
17
import { handleSubsumeCompletion } from "./infestedFoundryController";
18
18
19
19
export const inventoryController: RequestHandler = async (request, response) => {
20
let account;
21
try {
22
account = await getAccountForRequest(request);
23
} catch (e) {
24
response.status(400).send("Log-in expired");
25
return;
26
}
20
const account = await getAccountForRequest(request);
27
21
28
22
const inventory = await Inventory.findOne({ accountOwnerId: account._id.toString() });
29
23
@@ -22,7 +22,6 @@ export const startRecipeController: RequestHandler = async (req, res) => {
22
22
const recipe = getRecipe(recipeName);
23
23
24
24
if (!recipe) {
25
logger.error(`unknown recipe ${recipeName}`);
26
25
throw new Error(`unknown recipe ${recipeName}`);
27
26
}
28
27
@@ -0,0 +1,16 @@
1
import { NextFunction, Request, Response } from "express";
2
import { logger } from "../utils/logger";
3
4
export const errorHandler = (err: Error, req: Request, res: Response, _next: NextFunction): void => {
5
if (err.message == "Invalid accountId-nonce pair") {
6
res.status(400).json("Log-in expired");
7
} else if (err.stack) {
8
const stackArr = err.stack.split("\n");
9
stackArr[0] += ` while processing ${req.path} request`;
10
logger.error(stackArr.join("\n"));
11
res.status(500).end();
12
} else {
13
logger.error(`uncaught error while processing ${req.path} request: ${err.message}`);
14
res.status(500).end();
15
}
16
};
@@ -1,5 +1,4 @@
1
1
import { getIndexAfter } from "@/src/helpers/stringHelpers";
2
import { logger } from "@/src/utils/logger";
3
2
import {
4
3
dict_de,
5
4
dict_en,
@@ -54,7 +53,6 @@ export const getWeaponType = (weaponName: string): WeaponTypeInternal => {
54
53
const weaponType = weaponInfo.productCategory;
55
54
56
55
if (!weaponType) {
57
logger.error(`unknown weapon category for item ${weaponName}`);
58
56
throw new Error(`unknown weapon category for item ${weaponName}`);
59
57
}
60
58
@@ -83,7 +81,6 @@ export const getItemCategoryByUniqueName = (uniqueName: string): string => {
83
81
84
82
const index = getIndexAfter(uniqueName, splitWord);
85
83
if (index === -1) {
86
logger.error(`error parsing item category ${uniqueName}`);
87
84
throw new Error(`error parsing item category ${uniqueName}`);
88
85
}
89
86
const category = uniqueName.substring(index).split("/")[0];
@@ -1,12 +1,10 @@
1
1
import { Loadout } from "@/src/models/inventoryModels/loadoutModel";
2
import { logger } from "@/src/utils/logger";
3
2
4
3
export const getLoadout = async (accountId: string) => {
5
4
const loadout = await Loadout.findOne({ loadoutOwnerId: accountId });
6
5
7
6
if (!loadout) {
8
logger.error(`loadout not found for account ${accountId}`);
9
throw new Error("loadout not found");
7
throw new Error(`loadout not found for account ${accountId}`);
10
8
}
11
9
12
10
return loadout;
@@ -1,12 +1,10 @@
1
1
import { PersonalRooms } from "@/src/models/personalRoomsModel";
2
import { logger } from "@/src/utils/logger";
3
2
4
3
export const getPersonalRooms = async (accountId: string) => {
5
4
const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId });
6
5
7
6
if (!personalRooms) {
8
logger.error(`personal rooms not found for account ${accountId}`);
9
throw new Error("personal rooms not found");
7
throw new Error(`personal rooms not found for account ${accountId}`);
10
8
}
11
9
return personalRooms;
12
10
};
@@ -47,7 +47,6 @@ export const handleSetShipDecorations = async (
47
47
const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room);
48
48
49
49
if (!roomToPlaceIn) {
50
logger.error("room not found");
51
50
throw new Error("room not found");
52
51
}
53
52
@@ -59,7 +58,6 @@ export const handleSetShipDecorations = async (
59
58
);
60
59
61
60
if (existingDecorationIndex === -1) {
62
logger.error("decoration to be moved not found");
63
61
throw new Error("decoration to be moved not found");
64
62
}
65
63
@@ -143,13 +141,11 @@ export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlaced
143
141
144
142
const room = personalRooms.Ship.Rooms.find(room => room.Name === req.Room);
145
143
if (!room) {
146
logger.error("room not found");
147
144
throw new Error("room not found");
148
145
}
149
146
150
147
const placedDeco = room.PlacedDecos?.find(x => x._id.toString() == req.DecoId);
151
148
if (!placedDeco) {
152
logger.error("deco not found");
153
149
throw new Error("deco not found");
154
150
}
155
151
@@ -1,6 +1,5 @@
1
1
import { Ship } from "@/src/models/shipModel";
2
2
import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
3
import { logger } from "@/src/utils/logger";
4
3
import { Types } from "mongoose";
5
4
6
5
export const createShip = async (
@@ -26,7 +25,6 @@ export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = "
26
25
const ship = await Ship.findOne({ _id: shipId }, fieldSelection);
27
26
28
27
if (!ship) {
29
logger.error(`error finding a ship with id ${shipId.toString()}`);
30
28
throw new Error(`error finding a ship with id ${shipId.toString()}`);
31
29
}
32
30
@@ -39,7 +37,6 @@ export const getShipLean = async (shipOwnerId: string) => {
39
37
}>("LoadOutInventory.LoadOutPresets");
40
38
41
39
if (!ship) {
42
logger.error(`error finding a ship for account ${shipOwnerId}`);
43
40
throw new Error(`error finding a ship for account ${shipOwnerId}`);
44
41
}
45
42