sql >> Database >  >> RDS >> PostgreSQL

Controleer de databaseverbinding met pg-promise bij het starten van een app

Ik ben de auteur van pg-promise;) En dit is niet de eerste keer dat deze vraag wordt gesteld, dus ik geef het hier een gedetailleerde uitleg.

Wanneer u een nieuw database-object als volgt instantiseert:

const db = pgp(connection);

...alles wat het doet - maakt het object aan, maar het probeert geen verbinding te maken. De bibliotheek is bovenop de verbindingspool gebouwd en alleen de daadwerkelijke querymethoden vragen om een ​​verbinding van de pool.

Uit de officiële documentatie:

Object db vertegenwoordigt het databaseprotocol, met een luie databaseverbinding, d.w.z. dat alleen de daadwerkelijke querymethoden de verbinding verkrijgen en vrijgeven. Daarom moet u slechts één globale/gedeelde db . maken object per verbindingsdetails.

U kunt echter wel een verbinding forceren door de methode connect aan te roepen, zoals verderop wordt weergegeven. En hoewel deze methode geen aanbevolen manier is voor het koppelen van query's (daarvoor moeten taken worden gebruikt), is het handig om de verbinding in het algemeen te controleren.

Ik heb het voorbeeld gekopieerd uit mijn eigen post:https://github.com/vitaly-t/pg-promise/issues/81

Hieronder ziet u een voorbeeld van hoe u het op twee manieren tegelijk kunt doen, zodat u kunt kiezen welke benadering u het beste bevalt.

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

Uitgangen:

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

Elke fout in de bibliotheek wordt eerst gerapporteerd via de globale foutgebeurtenishandler, en pas daarna wordt de fout gerapporteerd in de corresponderende .catch afhandelaar.

Bijwerken

Moderne benadering voor het testen van de verbinding + het verkrijgen van de serverversie in één stap:

// 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
  • Gebeurtenisfout


  1. Wat is de maximale grootte voor een varchar2 PL/SQL-subprogrammaargument in Oracle?

  2. Wat is in vredesnaam een ​​DTU?

  3. 2 manieren om een ​​tabel te maken als deze nog niet bestaat in Oracle

  4. Een database maken van een script in MySQL