PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Überprüfen Sie die Datenbankverbindung mit pg-promise, wenn Sie eine App starten

Ich bin der Autor von pg-promise;) Und dies ist nicht das erste Mal, dass diese Frage gestellt wird, also gebe ich ihr hier eine ausführliche Erklärung.

Wenn Sie ein neues Datenbankobjekt wie folgt instanziieren:

const db = pgp(connection);

... alles, was es tut - erstellt das Objekt, versucht aber nicht, eine Verbindung herzustellen. Die Bibliothek baut auf dem Verbindungspool auf, und nur die eigentlichen Abfragemethoden fordern eine Verbindung aus dem Pool an.

Aus der offiziellen Dokumentation:

Objekt db stellt das Datenbankprotokoll dar, mit fauler Datenbankverbindung, d.h. nur die eigentlichen Abfragemethoden nehmen die Verbindung auf und geben sie wieder ab. Daher sollten Sie nur eine globale/gemeinsame db erstellen Objekt pro Verbindungsdetails.

Sie können jedoch eine Verbindung erzwingen, indem Sie die Methode connect aufrufen, wie weiter unten gezeigt. Und obwohl diese Methode keine empfohlene Methode zum Verketten von Abfragen ist (dafür sollten Aufgaben verwendet werden), ist sie im Allgemeinen praktisch, um die Verbindung zu überprüfen.

Ich habe das Beispiel aus meinem eigenen Beitrag kopiert:https://github.com/vitaly-t/pg-promise/issues/81

Unten ist ein Beispiel dafür, wie Sie dies auf zwei Arten gleichzeitig tun können, sodass Sie den Ansatz wählen können, der Ihnen besser gefällt.

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);
});

Ausgaben:

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

Jeder Fehler in der Bibliothek wird zuerst über den globalen Fehlerereignishandler gemeldet, und erst dann wird der Fehler innerhalb des entsprechenden .catch gemeldet Handler.

Aktualisieren

Moderner Ansatz zum Testen der Verbindung + Abrufen der Serverversion in einem Schritt:

// 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
}

Links

  • Methode verbinden
  • Ereignisfehler