Как сделать синхронный запрос (блокирующий вызов) с помощью node-postgres?

При загрузке моего приложения Node.js я хочу сделать пару синхронных вызовов базы данных PostgreSQL, чтобы проверить некоторые вещи, прежде чем продолжить поток управления. Как я могу добиться этого с помощью пакета node-postgres?


person Dejan    schedule 03.04.2013    source источник


Ответы (6)


Единственный способ синхронизировать вызовы — вложить их в обратные вызовы:

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
}

Это может быть больно и было бы тривиально в некоторых других языках, но такова природа зверя.

person Michael Payne    schedule 23.04.2013
comment
хороший комментарий: но такова природа зверя... Хотя сомневаюсь, что это зверь :) - person luigi7up; 24.06.2013
comment
Значит, нет возможности повторно использовать код? у меня есть функция, которая делает запрос pg и возвращает результаты, поэтому я могу вызывать эту функцию из разных мест. Это возможно? Спасибо - person Ryan Lee; 31.07.2014
comment
Да... Это, безусловно, самый уродливый код с использованием Postgres, который я когда-либо писал. Но +1 за правильный ответ. - person sudo; 22.01.2018
comment
@Michael Payne, и если мне нужно вставить данные в базу данных из данных, сгенерированных во время потока main ()? - person justcode; 24.04.2018
comment
Иногда, например, в конструкторе, нам нужны синхронные операции... Плохой момент для node-postgres! - person fred727; 03.02.2020

Вы можете использовать pg-native или pg-sync.

person Johannes Griebenow    schedule 26.10.2017
comment
pg-native великолепен. Спасибо - person sudo; 22.01.2018

Учитывая, что вызов по своей сути является асинхронным, вам нужно будет управлять им либо с помощью обратных вызовов (стиль де-факто Node), либо асинхронно, либо с помощью промисов (Q, when.js, Bluebird и т. д.). Обратите внимание, что по отношению к принятым ответ, обратные вызовы не единственный способ сделать это.

person alphadogg    schedule 16.01.2015

Вы можете сделать это, используя pg-pool в сочетании с 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();
person Black    schedule 30.11.2016

Я думаю, что это будет применимо.

person eonil    schedule 10.10.2013

brianc (автор node-postgres) прокомментировал здесь, что

«Единственный способ выполнять запросы синхронизации — это использовать pg-native и использовать вариант sync Методов. Используя чистый клиент JavaScript, невозможно выполнять запросы синхронизации из-за того, как работает узел."

Надеюсь это поможет...

person muelleth    schedule 29.06.2016