Estoy usando el módulo de nodo pg en mi aplicación y quiero asegurarme de que pueda manejar correctamente los errores de conexión y consulta.
El primer problema que tengo es que quiero asegurarme de que pueda recuperarse correctamente cuando Postgres no esté disponible.
Encontré que hay un evento de error para poder detectar si hay un error de conexión.
import pg from 'pg' let pgClient = null async function postgresConnect() { pgClient = new pg.Client(process.env.CONNECTION_STRING) pgClient.connect() pgClient.on('error', async (e) => { console.log('Reconnecting') await sleep(5000) await postgresConnect() }) }
No me gusta usar un global aquí, y quiero configurar el retraso de suspensión para hacer un pequeño retroceso exponencial. Noté que "Reconectando" se dispara dos veces inmediatamente, luego espera cinco segundos y no estoy seguro de por qué se disparó la primera vez sin esperar.
También tengo que asegurarme de que las consultas se ejecuten. Tengo algo como esto que estaba probando.
async function getTimestamp() { try { const res = await pgClient.query( 'select current_timestamp from current_timestamp;' ) return res.rows[0].current_timestamp } catch (error) { console.log('Retrying Query') await sleep(1000) return getTimestamp() } }
Esto parece funcionar, pero no lo he probado lo suficiente como para asegurarme de que garantizará que la consulta se ejecute o siga intentándolo. Debería buscar errores específicos y solo repetir para siempre en ciertos errores y fallar en otros. Necesito investigar más para encontrar qué errores se arrojan. También necesito hacer un retroceso en el retraso aquí también.
Todo "parece" funcionar, no quiero ser víctima del efecto Dunning-Kruger. Necesito asegurarme de que este proceso pueda manejar todo tipo de situaciones y recuperarse.