Estoy escribiendo una aplicación node.js en Heroku y usando el módulo pg . No puedo encontrar la forma "correcta" de obtener un objeto de cliente para cada solicitud que necesito para consultar la base de datos.
La documentación usa un código como este:
pg.connect(conString, function(err, client) {
// Use the client to do things here
});
Pero seguramente no necesita llamar pg.connect
dentro de cada función que usa la base de datos, ¿verdad? He visto otro código que hace esto:
var conString = process.env.DATABASE_URL || "tcp://postgres:1234@localhost/postgres";
var client = new pg.Client(conString);
client.connect();
// client is a global so you can use it anywhere now
Me estoy inclinando hacia la segunda opción porque creo que la instancia de base de datos gratuita para Heroku está limitada a una conexión de todos modos, pero ¿hay algún inconveniente en hacerlo de esta manera? ¿Debo comprobar si mi objeto cliente todavía está conectado cada vez antes de usarlo?
fuente
Soy el autor de pg-promise , que simplifica el uso de node-postgres a través de promises.
Aborda los problemas sobre la forma correcta de conectarse y desconectarse de la base de datos, utilizando el grupo de conexiones implementado por node-postgres , entre otras cosas, como transacciones automatizadas.
Una solicitud individual en pg-promise se reduce a lo que es relevante para la lógica de su negocio:
es decir, no necesita lidiar con la lógica de conexión al ejecutar consultas, porque configura la conexión solo una vez, globalmente, así:
Puede encontrar muchos más ejemplos en el tutorial Learn by Example o en la página de inicio del proyecto .
fuente
pg
esto está especificado porpg.defaults.ssl = true;
. ¿Cómo haces esto enpg-promise
?pgp.pg.defaults.ssl = true;
La piscina es el camino a seguir ahora. Algo como esto
se puede usar como
db.query('<BEGIN,COMMIT,ROLLBACK,your query,anything')
fuente
Es mejor crear un grupo de pg globalmente y cada vez que necesite hacer una operación de base de datos, use el cliente y luego vuelva a enviarlo al grupo. Una vez que se realizan todas las operaciones de db, finalice el grupo usando
pool.end()
Código de muestra -
Para obtener más detalles, puede consultar la publicación de mi blog - Fuente
fuente
Como puede ver en la documentación, ambas opciones son válidas, así que elija la que prefiera. Como tú, iría con la segunda opción.
fuente
Estaba interesado en un controlador muy simple para esto, así que hice el mío sin complicarlo demasiado. No me hago ilusiones de que sea súper básico, pero podría ayudar a algunas personas a comenzar. Básicamente, se conecta, ejecuta consultas y maneja errores por usted.
Entonces lo usaría llamándolo de esta manera:
fuente
node-postgres
página funciona mejor que esto.Así es como lo hago, una especie de "enfoque de todos los anteriores"
fuente