From 5a59f5507e2f6be0d61d1a68488007d6b4522e66 Mon Sep 17 00:00:00 2001 From: Radoslaw Wielonski Date: Tue, 7 Dec 2021 11:35:08 +0100 Subject: [PATCH] feat: add flag for default error handler Signed-off-by: Radoslaw Wielonski --- .../src/service/lib/ServiceBuilderImpl.test.ts | 3 ++- .../src/service/lib/ServiceBuilderImpl.ts | 16 +++++++++++++++- packages/backend-common/src/service/types.ts | 7 +++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/backend-common/src/service/lib/ServiceBuilderImpl.test.ts b/packages/backend-common/src/service/lib/ServiceBuilderImpl.test.ts index 665eaa6550..10363f9d1b 100644 --- a/packages/backend-common/src/service/lib/ServiceBuilderImpl.test.ts +++ b/packages/backend-common/src/service/lib/ServiceBuilderImpl.test.ts @@ -40,11 +40,12 @@ describe('ServiceBuilderImpl', () => { const serviceBuilder = new ServiceBuilderImpl(module); const customErrorHandler = ( error: Error, + // @ts-ignore req: Request, + // @ts-ignore res: Response, next: NextFunction, ) => { - console.log(req, res); next(error); }; serviceBuilder.setErrorHandler(customErrorHandler); diff --git a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts index 8d6404076f..54f145539f 100644 --- a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts +++ b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts @@ -67,6 +67,7 @@ export class ServiceBuilderImpl implements ServiceBuilder { private routers: [string, Router][]; private requestLoggingHandler: RequestLoggingHandlerFactory | undefined; private errorHandler: ErrorRequestHandler | undefined; + private useDefaultErrorHandler: boolean; // Reference to the module where builder is created - needed for hot module // reloading private module: NodeModule; @@ -74,6 +75,7 @@ export class ServiceBuilderImpl implements ServiceBuilder { constructor(moduleRef: NodeModule) { this.routers = []; this.module = moduleRef; + this.useDefaultErrorHandler = true; } loadConfig(config: Config): ServiceBuilder { @@ -158,6 +160,11 @@ export class ServiceBuilderImpl implements ServiceBuilder { return this; } + disableDefaultErrorHandler() { + this.useDefaultErrorHandler = false; + return this; + } + async start(): Promise { const app = express(); const { port, host, logger, corsOptions, httpsSettings, helmetOptions } = @@ -175,7 +182,14 @@ export class ServiceBuilderImpl implements ServiceBuilder { app.use(root, route); } app.use(notFoundHandler()); - app.use(this.errorHandler ?? defaultErrorHandler()); + + if (this.errorHandler) { + app.use(this.errorHandler); + } + + if (this.useDefaultErrorHandler) { + app.use(defaultErrorHandler()); + } const server: http.Server = httpsSettings ? await createHttpsServer(app, httpsSettings, logger) diff --git a/packages/backend-common/src/service/types.ts b/packages/backend-common/src/service/types.ts index 37bfec3c43..3ec4c7aa0e 100644 --- a/packages/backend-common/src/service/types.ts +++ b/packages/backend-common/src/service/types.ts @@ -107,6 +107,13 @@ export type ServiceBuilder = { */ setErrorHandler(errorHandler: ErrorRequestHandler): ServiceBuilder; + /** + * Disable default error handler + * + * If it's not called, default error handler is used + */ + disableDefaultErrorHandler(): ServiceBuilder; + /** * Starts the server using the given settings. */