Как я могу использовать более одного запроса в Node-postgres?

#node.js #postgresql #node-postgres

#node.js #postgresql #node-postgres

Вопрос:

Итак, я не уверен, как работает node-pg, но я уже некоторое время пытаюсь заставить его работать, осматриваясь, пробуя что-то и читая документацию. Чего я хочу добиться, так это иметь возможность отправлять несколько запросов в разное время, но он всегда выдает ошибки после отправки первого, если я решусь ввести второй. Этот вопрос задавался несколько раз в Интернете, но я не вижу никаких полезных ответов. Я могу использовать объединение, если это необходимо (у этого тоже были проблемы).

Что работает сейчас: (Это на heroku, поэтому я должен использовать process.env.DATABASE_URL)

 const { Client } = require('pg');

const client = new Client({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
  }
});
client.connect()

client

.query('SELECT * FROM test WHERE....')
.then(results => {
console.log(results);
}

.catch(err => {
console.log(err.stack)
 })
  

Что я пытаюсь сделать:

 const { Client } = require('pg');

const client = new Client({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
  }
});
client.connect()

client

.query('SELECT * FROM test1 WHERE....')
.then(results => {
console.log("FIRST RESULTS: "results);
}

.catch(err => {
console.log(err.stack)
 })

.query('SELECT * FROM test2 WHERE....')
.then(results => {
console.log("SECOND RESULTS: "results);
}

.catch(err => {
console.log(err.stack)
 })
  

Комментарии:

1. Я пробовал несколько вещей, поэтому получил несколько разных ошибок. Вероятно, я делал это неправильно, но я не могу найти ни одного примера в Интернете с более чем одним запросом, поэтому я пришел сюда. При использовании пула, когда я использовал конкретные клиенты, подобные этому примеру: node-postgres.com/features/pooling ошибка была «клиент. запрос (…).then(…).query не является функцией» во втором запросе, в то время как без клиентов его аналогично: «Ошибка типа: пул. запрос (…).then(…).catch(…).query не является функцией »

Ответ №1:

Когда вы .query возвращаете обещание, а у обещаний нет .query методов — все, что вы можете сделать с обещанием, это вызвать .then или .catch на нем (или .finally , иногда).

Если вы хотите создать новый запрос после завершения старого, вызовите client.query внутри .then :

 client
  .query('SELECT * FROM test1 WHERE....')
  .then(results => {
      console.log("FIRST RESULTS: "   results);
    })
    .then(() => client.query('SELECT * FROM test2 WHERE....'))
    .then(results => {
      console.log("SECOND RESULTS: "   results);
    })
    .catch(err => {
      // better to handle errors at the end, probably
      console.log(err.stack)
    })
  

Если второй запрос зависит от результата первого, рассмотрите возможность использования async вместо него функции, чтобы сделать код более плоским и более читаемым.

Если второй запрос не зависит от результата первого, рассмотрите возможность использования Promise.all вместо этого, чтобы можно было выполнять оба запроса одновременно, а не ждать, пока первый завершится первым.

Комментарии:

1. Большое вам спасибо. Наконец, это работает. Это отвечает на мой вопрос, поэтому я принимаю его, но я не уверен, что мне следует делать, если мне понадобятся дополнительные запросы позже в другом блоке кода. Могу ли я просто вызвать функцию, которая снова включает тот же процесс? «Клиент. запрос (..).затем (..)» потому что, когда я попробовал это, я получил еще одну ошибку. Он отлично работает в последовательном режиме. Затем, но я не знаю, что делать в этом другом экземпляре. Если вы готовы помочь больше, я был бы признателен. Спасибо.

2. Каждый раз, когда вам нужно выполнить больше запросов, возвращайте их внутри .then s, чтобы следующий .then мог обрабатывать их разрешающие значения. Если вы хотите выполнить два запроса одновременно, выполните return Promise.all([client.query(...), client.query(..)]) и .then(([result1, result2]) => { /* do stuff with result1 and result2 */

3. Спасибо, я думаю, что я все понял с вашей помощью. Надеюсь, последний вопрос, когда я должен использовать client.end()?? Если я правильно понимаю, как только я его использую, я больше не смогу отправлять запросы, даже не открывая его как-то правильно?

4. Я думаю, вы бы вызвали его, как только закончите, например, после a finally . .catch(...).finally(() => { client.end(); });