web-dev-qa-db-fra.com

Vérifier la connexion à la base de données avec pg-promise lors du démarrage d'une application

Je construis une application express qui se connecte à une base de données postgres en utilisant le module pg-promise .

Je souhaite m'assurer que la connexion à la base de données réussit lors du démarrage du serveur d'applications. En d'autres termes, si la connexion à la base de données échoue, je voudrais envoyer une erreur.

Mon fichier server.js est le suivant:

const express = require("express");

const databaseConfig= {
  "Host": "localhost",
  "port": 5432,
  "database": "library_app",
  "user": "postgres"
};

const pgp = require("pg-promise")({});
const db = pgp(databaseConfig);

const app = express();
const port = 5000;

app.listen(port, (err) => {
  console.log(`running server on port: ${port}`);
});

La configuration actuelle démarrera le serveur express indépendamment de la validité de la connexion à la base de données, ce qui n'est pas le comportement que j'aimerais.

J'ai essayé de parcourir les documents, mais je n'ai pas trouvé de solution. J'ai également essayé const db = pgp(databaseConfig).catch((err) => { // blow up });, mais cela n'a pas fonctionné car pgp ne renvoie pas de promesse.

25
Steven L.

Je suis l'auteur de pg-promise ;) Et ce n'est pas la première fois que cette question est posée, donc je lui donne une explication détaillée ici.

Lorsque vous instanciez un nouvel objet de base de données comme celui-ci:

const db = pgp(connection);

... tout ce qu'il fait - crée l'objet, mais il n'essaie pas de se connecter. La bibliothèque est construite au-dessus du pool de connexions et seules les méthodes de requête réelles demandent une connexion au pool.

De la documentation officielle :

L'objet db représente le protocole de base de données, avec une connexion de base de données paresseuse, c'est-à-dire que seules les méthodes de requête réelles acquièrent et libèrent la connexion. Par conséquent, vous ne devez créer qu'un seul objet global/partagé db par détail de connexion.

Cependant, vous pouvez demander à la bibliothèque de se connecter sans exécuter de requête, en utilisant la méthode connect , comme indiqué plus loin.

Et bien que cette méthode ne soit plus un moyen recommandé pour chaîner des requêtes, depuis que la prise en charge de Tâches a été introduite (comme une approche plus sûre), elle est toujours utile pour vérifier la connexion en général.

J'ai copié l'exemple de mon propre post: https://github.com/vitaly-t/pg-promise/issues/81

Vous trouverez ci-dessous un exemple de le faire de deux façons en même temps, de sorte que vous pouvez choisir la meilleure approche.

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:password@Host:port/database');

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

Les sorties:

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

Chaque erreur dans la bibliothèque est d'abord signalée via le gestionnaire d'événement global error , et alors seulement l'erreur est signalée dans le gestionnaire .catch Correspondant.

Alternative

Au lieu d'établir la connexion manuellement, vous pouvez simplement exécuter un type de requête qui réussirait toujours pour une connexion valide, comme la suivante:

db.proc('version')
    .then(data => {
        // SUCCESS
        // data.version =
        // 'PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit'
    })
    .catch(error => {
        // connection-related error
    });

Liens API:

47
vitaly-t