PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Verifique a conexão do banco de dados com pg-promise ao iniciar um aplicativo


Eu sou o autor de pg-promise;) E esta não é a primeira vez que esta pergunta é feita, então estou dando uma explicação detalhada aqui.

Quando você instancia um novo objeto de banco de dados como este:
const db = pgp(connection);

...tudo o que faz - cria o objeto, mas não tenta se conectar. A biblioteca é construída sobre o pool de conexões e somente os métodos de consulta reais solicitam uma conexão do pool.

Da documentação oficial:

Objeto db representa o protocolo de banco de dados, com conexão de banco de dados lenta, ou seja, apenas os métodos de consulta reais adquirem e liberam a conexão. Portanto, você deve criar apenas um db global/compartilhado objeto por detalhes de conexão.

No entanto, você pode forçar uma conexão, chamando o método connect, conforme mostrado mais adiante. E embora esse método não seja uma maneira recomendada para encadear consultas (as tarefas devem ser usadas para isso), é útil verificar a conexão em geral.

Copiei o exemplo do meu próprio post:https://github.com/vitaly-t/pg-promise/issues/81

Abaixo está um exemplo de como fazer isso de duas maneiras ao mesmo tempo, para que você possa escolher a abordagem que preferir.
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);
});

Saídas:

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

Cada erro na biblioteca é relatado primeiro por meio do manipulador de eventos de erro global e somente então o erro é relatado no .catch correspondente manipulador.

Atualizar


Abordagem moderna para testar a conexão + obter a versão do servidor em uma etapa:
// 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
  • Método de conexão
  • Erro de evento