How to make connection to Postgres via Node.js How to make connection to Postgres via Node.js postgresql postgresql

How to make connection to Postgres via Node.js


Here is an example I used to connect node.js to my Postgres database.

The interface in node.js that I used can be found here https://github.com/brianc/node-postgres

var pg = require('pg');var conString = "postgres://YourUserName:YourPassword@localhost:5432/YourDatabase";var client = new pg.Client(conString);client.connect();//queries are queued and executed one after another once the connection becomes availablevar x = 1000;while (x > 0) {    client.query("INSERT INTO junk(name, a_number) values('Ted',12)");    client.query("INSERT INTO junk(name, a_number) values($1, $2)", ['John', x]);    x = x - 1;}var query = client.query("SELECT * FROM junk");//fired after last row is emittedquery.on('row', function(row) {    console.log(row);});query.on('end', function() {    client.end();});//queries can be executed either via text/parameter values passed as individual arguments//or by passing an options object containing text, (optional) parameter values, and (optional) query nameclient.query({    name: 'insert beatle',    text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)",    values: ['George', 70, new Date(1946, 02, 14)]});//subsequent queries with the same name will be executed without re-parsing the query plan by postgresclient.query({    name: 'insert beatle',    values: ['Paul', 63, new Date(1945, 04, 03)]});var query = client.query("SELECT * FROM beatles WHERE name = $1", ['john']);//can stream row results back 1 at a timequery.on('row', function(row) {    console.log(row);    console.log("Beatle name: %s", row.name); //Beatle name: John    console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates    console.log("Beatle height: %d' %d\"", Math.floor(row.height / 12), row.height % 12); //integers are returned as javascript ints});//fired after last row is emittedquery.on('end', function() {    client.end();});

UPDATE:- THE query.on function is now deprecated and hence the above code will not work as intended. As a solution for this look at:- query.on is not a function


A modern and simple approach: pg-promise:

const pgp = require('pg-promise')(/* initialization options */);const cn = {    host: 'localhost', // server name or IP address;    port: 5432,    database: 'myDatabase',    user: 'myUser',    password: 'myPassword'};// alternative:// var cn = 'postgres://username:password@host:port/database';const db = pgp(cn); // database instance;// select and return a single user name from id:db.one('SELECT name FROM users WHERE id = $1', [123])    .then(user => {        console.log(user.name); // print user name;    })    .catch(error => {        console.log(error); // print the error;    });// alternative - new ES7 syntax with 'await':// await db.one('SELECT name FROM users WHERE id = $1', [123]);

See also: How to correctly declare your database module.


Just to add a different option - I use Node-DBI to connect to PG, but also due to the ability to talk to MySQL and sqlite. Node-DBI also includes functionality to build a select statement, which is handy for doing dynamic stuff on the fly.

Quick sample (using config information stored in another file):

var DBWrapper = require('node-dbi').DBWrapper;var config = require('./config');var dbConnectionConfig = { host:config.db.host, user:config.db.username, password:config.db.password, database:config.db.database };var dbWrapper = new DBWrapper('pg', dbConnectionConfig);dbWrapper.connect();dbWrapper.fetchAll(sql_query, null, function (err, result) {  if (!err) {    console.log("Data came back from the DB.");  } else {    console.log("DB returned an error: %s", err);  }  dbWrapper.close(function (close_err) {    if (close_err) {      console.log("Error while disconnecting: %s", close_err);    }  });});

config.js:

var config = {  db:{    host:"plop",    database:"musicbrainz",    username:"musicbrainz",    password:"musicbrainz"  },}module.exports = config;