loopbackio / loopbackio/loopback-next
Database connect error during app boot should not terminate node process
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- TypeScript
- Estrellas
- 5.1k
- Forks
- 1.1k
- Merge medio
- 2 d 21 h
- PR fusionados (30 d)
- 27
Descripción
Describe the bug
Steps to repro:
- Scaffold new app (lb4 app)
- Scaffold new mysql data source (lb4 datasource). Enter invalid connection info, so that the connection fails during boot.
- Build and run the app
Expected:
Server starts successfully, and /ping endpoint may be ran.
Actual:
Server fails to boot and the process terminates
Alternative with lazy connect:
If "lazy connect" is enabled on the data source config, and a manual datasource.connect() is made later on, the error will cause an unhandled exception to crash the node server. Be aware that trying to run datasource.execute() directly without a connected data source will return a promise that will never resolve until a connection is made.
Note that this occurs even if the call is wrapped in a try/catch.
Further, normal crud repository fetchers, which internally queue the connect, are unaffected.
example:
{
...other datasource props,
lazyConnect: true
}
@get('/test')
async test() {
try {
//execute will only queue, if not connected, causing an infinite wait
if (!this.dataSource.connected)
await this.dataSource.connect();
//execute custom sql
await this.dataSource.execute("select 1");
return true;
} catch(ex) {
return false;
}
}
Use Case:
Health check endpoints that check if parts of the application are online, including the database.
It is vital that the api continue to run, even if a dependency is unavailable. If a datasource.execute() or datasource.connect() fails inside a controller method, then it should not tear down the server with it!
Cli Version: 3.2.0
Logs
No response
Additional information
No response
Reproduction
repro provided above
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con las rutas datasource.connect() y datasource.execute() descritas en la reproducción, incluido su uso durante el arranque de la aplicación y desde el ejemplo del controlador. Reproduce la conexión MySQL no válida con lazyConnect habilitado y, después, verifica que los fallos durante el arranque y a nivel del controlador se gestionen sin terminar el proceso de Node ni dejar la solicitud sin resolver.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- mysql, nodejs, typescript
- Área
- api, backend, database
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100