Estoy usando una base de datos postgres para mi servidor web express. Estoy usando la biblioteca 'pg' para ejecutar consultas en esta base de datos.
Aquí está mi método de conexión:
const db = new Client({ user: 'xxx', host: 'xxx', database: 'xxx', password: 'xxx', port: xxx, }) db.connect(err => { if (err) { console.error('connection error', err.stack) } else { console.log('connected') }
Luego, para ejecutar una solicitud, hago esto:
db.query(MY_REQUEST, function (err, data) { if (err) throw err; res.render('hello/world', { title: 'Hello', data: data.rows }); });`
Todo funciona perfectamente. Pero después de varios minutos sin usar mi sitio web, mi conexión a la base de datos se agota y aparece el siguiente error:
node:events:355 throw er; // Unhandled 'error' event ^ Error: Connection terminated unexpectedly at Connection.<anonymous> (/usr/src/app/node_modules/pg/lib/client.js:132:73) at Object.onceWrapper (node:events:484:28) at Connection.emit (node:events:378:20) at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:58:12) at Socket.emit (node:events:378:20) at TCP.<anonymous> (node:net:665:12) Emitted 'error' event on Client instance at: at Client._handleErrorEvent (/usr/src/app/node_modules/pg/lib/client.js:319:10) at Connection.<anonymous> (/usr/src/app/node_modules/pg/lib/client.js:149:16) at Object.onceWrapper (node:events:484:28) [... lines matching original stack trace ...] at TCP.<anonymous> (node:net:665:12)
¿Cómo podría hacer para volver a conectarme automáticamente cuando se corta la conexión o cuando falla una solicitud?
Debe adjuntar un controlador de error
para evitar que el error no controlado bloquee su aplicación. Es tan simple como:
db.on('error', e => { console.error('DB error', e); });
En cuanto a por qué ocurre el error, necesitamos más detalles, ¿parece que podría ser un restablecimiento de la conexión debido a un tiempo de inactividad?
Puede crear una función para controlar si está conectado a la base de datos o no, antes de continuar con su función principal.
Cree una función para controlar database connection status
de datos, reconnecting
, etc. y antes de ejecutar una función relacionada con la base de datos, primero inicie esa función intermedia y espere el resultado, después de eso puede continuar usando la base de datos nuevamente.
Si lo desea (que debería ser la forma preferida en su mayoría), cree esa middle function as an async function
y return a promise
, cuando use esa función, wait for that function
.