11

While booting my Node.js app, I want to make a couple of synchronous calls to the PostgreSQL database to check some things before continuing the control flow. How can I achieve this using the node-postgres package?

Dejan
  • 9,150
  • 8
  • 69
  • 117

5 Answers5

10

You can use the pg-native or pg-sync package.

Stormtrooper CWR
  • 533
  • 1
  • 6
  • 19
7

The only way to synchronize calls is to nest them in callbacks:

function init() {
  pg.connect('tcp://user@host/db', function(err, client, done) {
    client.query("SELECT column FROM table", function(err, result) {
      // check some things...
      client.query("SELECT column FROM other_table", function(err, result) {
        // check some other things...
        main(); // proceed with flow...
      }
    });
  }
}

function main() {
  // main logic
}

This can be a pain, and would be trivial in some other languages, but it is the nature of the beast.

Michael Payne
  • 534
  • 5
  • 13
3

brianc (author of node-postgres) commented here, that

"The only way to do sync queries is to use pg-native and use the sync variant of the methods. Using pure javascript client it is impossible to do sync queries because of how node works."

Hope this helps...

muelleth
  • 321
  • 2
  • 6
  • 1
    This is the only valid answer for question in topic: `"How to make a synchronous query (blocking call) with node-postgres?"` – fider Jul 22 '22 at 12:57
1

Given that the call is inherently asynchronous, you'll need to manage it either via callbacks (the defacto Node style), async or via promises (Q, when.js, Bluebird, etc...) Please note that wrt to the accepted answer, callbacks are not the only way to do this.

alphadogg
  • 12,762
  • 9
  • 54
  • 88
1

You can do this by using pg-pool in combination with asyncawait:

var suspendable = async (function defn(a, b) {
 var name1 = await(pool.query('select $1::text as name', ['foo']));
 console.log(name1.rows[0].name, 'says hello');
 var name2 = await(pool.query('select $1::text as name', ['bar']));
 console.log(name2.rows[0].name, 'says hello');
});

suspendable();
Black
  • 5,023
  • 6
  • 63
  • 92