Para conectar node con postgres requerimos del paquete pg, un driver que nos permite hacer queries y demás a la base de datos; pg se puede instalar con cualquier gestor de dependencias para node.

npm install pg 
yarn add pg

Después de que tengamos la dependencia instalada solo debemos importar la clase Client del driver y darle las credenciales necesarias para configurar la conexión:

const { Client } = require("pg");

const getConnection = async () => {
  const client = new Client({
    host: "localhost",
    port: 5432,
    user: "your_username",
    password: "your_password",
    database: "my_store"
  });
  await client.connect();
  return client;
};

module.exports = {
  getConnection
};

La clase Client recibe los siguientes parámetros:

De esta forma tenemos la conexión lista y podemos utilizar la función getConnection en cualquier parte que necesitemos conectarnos a la base de datos.

Conexión con pooling

La conexión que acabamos de realizar funciona perfectamente, pero no es lo mejor que podemos hacer ¿Por qué? Es bastante simple, cada vez que utilizamos la función getConnection estamos creando una nueva conexión con la base de datos, lo cual no es lo mejor si tuviéramos muchísimas peticiones a la base de datos frecuentemente.

El pooling nos permite crear una sola conexión que reutilizamos para todas las consultas que le hagamos a la base de datos. pg nos da la posibilidad de lograr esto con otra de sus clases: Pool.

const { Pool } = require("pg");

const pool = new Pool(...configObject);

module.exports = {
  pool
};

Pool recibe un objeto de configuración exactamente igual al que recibe Client.

Y de esta forma podemos reutilizar la misma conexión en nuestra app.

Pool y Client pueden recibir un solo parámetro que puede reemplazar todos los anteriores; connectionString nos permite pasar una URI que siga el siguiente formato:

postgres://user:password@host:port/database