При загрузке моего приложения Node.js я хочу сделать пару синхронных вызовов базы данных PostgreSQL, чтобы проверить некоторые вещи, прежде чем продолжить поток управления. Как я могу добиться этого с помощью пакета node-postgres?
Как сделать синхронный запрос (блокирующий вызов) с помощью node-postgres?
Ответы (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
}
Это может быть больно и было бы тривиально в некоторых других языках, но такова природа зверя.
Учитывая, что вызов по своей сути является асинхронным, вам нужно будет управлять им либо с помощью обратных вызовов (стиль де-факто Node), либо асинхронно, либо с помощью промисов (Q, when.js, Bluebird и т. д.). Обратите внимание, что по отношению к принятым ответ, обратные вызовы не единственный способ сделать это.
Вы можете сделать это, используя 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();
brianc (автор node-postgres) прокомментировал здесь, что
«Единственный способ выполнять запросы синхронизации — это использовать pg-native и использовать вариант
sync
Методов. Используя чистый клиент JavaScript, невозможно выполнять запросы синхронизации из-за того, как работает узел."
Надеюсь это поможет...