Make sure that the server builder propagates init errors properly

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2021-11-11 11:58:33 +01:00
parent f979fcf519
commit a8732a1200
3 changed files with 34 additions and 18 deletions
+12
View File
@@ -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
```
@@ -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);
});
}
+1 -1
View File
@@ -140,7 +140,7 @@ async function main() {
await service.start().catch(err => {
logger.error(err);
process.exit(1);
throw err;
});
}