How to make a synchronous query (blocking call) wi

2019-06-17 02:20发布

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?

6条回答
你好瞎i
2楼-- · 2019-06-17 02:43

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();
查看更多
相关推荐>>
3楼-- · 2019-06-17 02:47

I think this would be applicable.

查看更多
男人必须洒脱
4楼-- · 2019-06-17 02:54

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.

查看更多
Anthone
5楼-- · 2019-06-17 02:58

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.

查看更多
冷血范
6楼-- · 2019-06-17 03:09

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

查看更多
劳资没心,怎么记你
7楼-- · 2019-06-17 03:09

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

查看更多
登录 后发表回答