How to make a synchronous query (blocking call) wi

2019-06-17 02:17发布

问题:

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?

回答1:

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.



回答2:

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



回答3:

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.



回答4:

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();


回答5:

I think this would be applicable.

  • node-fiber


回答6:

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...