diff --git a/backend/src/middlewares/error.ts b/backend/src/middlewares/error.ts index 454105499602..3cc572d04197 100644 --- a/backend/src/middlewares/error.ts +++ b/backend/src/middlewares/error.ts @@ -46,9 +46,11 @@ async function errorHandlingMiddleware( uid: monkeyError.uid ?? req.ctx?.decodedToken?.uid, }; let message = "Unknown error"; + let isDbError = false; if (/ECONNREFUSED.*27017/i.test(error.message)) { message = "Could not connect to the database. It may be down."; + isDbError = true; } else if (error instanceof URIError || error instanceof SyntaxError) { status = 400; message = "Unprocessable request"; @@ -73,27 +75,30 @@ async function errorHandlingMiddleware( errorId: string; }; - try { - await addLog( - "system_error", - `${status} ${errorId} ${error.message} ${error.stack}`, - uid - ); - await db.collection("errors").insertOne({ - _id: errorId, - timestamp: Date.now(), - status: status, - uid, - message: error.message, - stack: error.stack, - endpoint: req.originalUrl, - method: req.method, - url: req.url, - }); - } catch (e) { - Logger.error("Logging to db failed."); - Logger.error(getErrorMessage(e) ?? "Unknown error"); - console.error(e); + if (!isDbError) { + try { + await addLog( + "system_error", + `${status} ${errorId} ${error.message} ${error.stack}`, + uid + ); + + await db.collection("errors").insertOne({ + _id: errorId, + timestamp: Date.now(), + status: status, + uid, + message: error.message, + stack: error.stack, + endpoint: req.originalUrl, + method: req.method, + url: req.url, + }); + } catch (e) { + Logger.error("Logging to db failed."); + Logger.error(getErrorMessage(e) ?? "Unknown error"); + console.error(e); + } } } else { Logger.error(`Error: ${error.message} Stack: ${error.stack}`); diff --git a/backend/src/server.ts b/backend/src/server.ts index 68c7ca3e58a7..c8cc06f508fc 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -19,11 +19,24 @@ import { createIndicies as leaderboardDbSetup } from "./dal/leaderboards"; import { createIndicies as blocklistDbSetup } from "./dal/blocklist"; import { createIndicies as connectionsDbSetup } from "./dal/connections"; import { getErrorMessage } from "./utils/error"; +import { exit } from "process"; async function bootServer(port: number): Promise { try { Logger.info(`Starting server version ${version}`); Logger.info(`Starting server in ${process.env["MODE"]} mode`); + + process.on("unhandledRejection", (err) => { + const isDbError = + err instanceof Error && /ECONNREFUSED.*27017/i.test(err.message); + if (isDbError) { + Logger.error("Failed to connect to database, ignore error"); + } else { + Logger.error("Unhandled rejection: " + getErrorMessage(err)); + exit(-1); + } + }); + Logger.info(`Connecting to database ${process.env["DB_NAME"]}...`); await db.connect(); Logger.success("Connected to database");