PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Verifica la connessione al database con pg-promise all'avvio di un'app

Sono l'autore di pg-promise;) E questa non è la prima volta che viene posta questa domanda, quindi ne fornisco una spiegazione dettagliata qui.

Quando istanzia un nuovo oggetto database come questo:

const db = pgp(connection);

...tutto ciò che fa - crea l'oggetto, ma non tenta di connettersi. La libreria si basa sul pool di connessioni e solo i metodi di query effettivi richiedono una connessione dal pool.

Dalla documentazione ufficiale:

Oggetto db rappresenta il protocollo del database, con connessione al database lazy, ovvero solo i metodi di query effettivi acquisiscono e rilasciano la connessione. Pertanto, dovresti creare un solo db globale/condiviso oggetto per dettagli di connessione.

Tuttavia, puoi forzare una connessione, chiamando il metodo connect, come mostrato più avanti. E sebbene questo metodo non sia un metodo consigliato per concatenare le query (le attività dovrebbero essere utilizzate per questo), è utile per controllare la connessione in generale.

Ho copiato l'esempio dal mio post:https://github.com/vitaly-t/pg-promise/issues/81

Di seguito è riportato un esempio di come farlo in due modi contemporaneamente, così puoi scegliere l'approccio che preferisci.

const initOptions = {
    // global event notification;
    error(error, e) {
        if (e.cn) {
            // A connection-related error;
            //
            // Connections are reported back with the password hashed,
            // for safe errors logging, without exposing passwords.
            console.log('CN:', e.cn);
            console.log('EVENT:', error.message || error);
        }
    }
};
    
const pgp = require('pg-promise')(initOptions);
    
// using an invalid connection string:
const db = pgp('postgresql://userName:[email protected]:port/database');
    
db.connect()
    .then(obj => {
        // Can check the server version here (pg-promise v10.1.0+):
        const serverVersion = obj.client.serverVersion;

        obj.done(); // success, release the connection;
    })
    .catch(error => {
        console.log('ERROR:', error.message || error);
});

Uscite:

CN: postgresql://userName:########@host:port/database EVENT: getaddrinfo ENOTFOUND host host:5432 ERROR: getaddrinfo ENOTFOUND host host:5432

Ogni errore nella libreria viene prima segnalato tramite il gestore di eventi di errore globale, e solo allora l'errore viene segnalato all'interno del corrispondente .catch gestore.

Aggiorna

Approccio moderno per testare la connessione + ottenere la versione del server in un solo passaggio:

// tests connection and returns Postgres server version,
// if successful; or else rejects with connection error:
async function testConnection() {
    const c = await db.connect(); // try to connect
    c.done(); // success, release connection
    return c.client.serverVersion; // return server version
}

Link

  • Metodo di connessione
  • Errore evento