From a8732a1200bc4dfa90de84841f98e7a0d057fd2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 11 Nov 2021 11:58:33 +0100 Subject: [PATCH] Make sure that the server builder propagates init errors properly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/rich-pillows-cough.md | 12 ++++++ .../src/service/lib/ServiceBuilderImpl.ts | 38 ++++++++++--------- packages/backend/src/index.ts | 2 +- 3 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 .changeset/rich-pillows-cough.md diff --git a/.changeset/rich-pillows-cough.md b/.changeset/rich-pillows-cough.md new file mode 100644 index 0000000000..959eb69214 --- /dev/null +++ b/.changeset/rich-pillows-cough.md @@ -0,0 +1,12 @@ +--- +'@backstage/backend-common': patch +--- + +Make sure that server builder `start()` propagates errors (such as failing to bind to the required port) properly and doesn't resolve the promise prematurely. + +After this change, the backend logger will be able to actually capture the error as it happens: + +``` +2021-11-11T10:54:21.334Z backstage info Initializing http server +2021-11-11T10:54:21.335Z backstage error listen EADDRINUSE: address already in use :::7000 code=EADDRINUSE errno=-48 syscall=listen address=:: port=7000 +``` diff --git a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts index ed16c9c9a7..a50fed9e93 100644 --- a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts +++ b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts @@ -176,25 +176,29 @@ export class ServiceBuilderImpl implements ServiceBuilder { : createHttpServer(app, logger); return new Promise((resolve, reject) => { - app.on('error', e => { - logger.error(`Failed to start up on port ${port}, ${e}`); + function handleStartupError(e: unknown) { + server.close(); reject(e); + } + + app.on('error', handleStartupError); + server.on('error', handleStartupError); + + server.listen(port, host, () => { + app.off('error', handleStartupError); + server.off('error', handleStartupError); + + const stoppableServer = stoppable(server, 0); + + useHotCleanup(this.module, () => + stoppableServer.stop((e: any) => { + if (e) console.error(e); + }), + ); + + logger.info(`Listening on ${host}:${port}`); + resolve(stoppableServer); }); - - const stoppableServer = stoppable( - server.listen(port, host, () => { - logger.info(`Listening on ${host}:${port}`); - }), - 0, - ); - - useHotCleanup(this.module, () => - stoppableServer.stop((e: any) => { - if (e) console.error(e); - }), - ); - - resolve(stoppableServer); }); } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index ffdce949b7..f3e4547e16 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -140,7 +140,7 @@ async function main() { await service.start().catch(err => { logger.error(err); - process.exit(1); + throw err; }); }