Свободный запрос за пределами просроченного соединения

1

Я пытаюсь выполнить следующий запрос pg- prom, но получаю эту ошибку:

Свободный запрос за пределами истекшего соединения

Запрос действительно преуспевает, но даже в этом случае я хотел бы избавиться от сообщения об ошибке.

Запрос pg-prom

 db.task(t => {
          t.oneOrNone(queries.insertUser, [profile.id])
          .then(id =>{ 
          if (id) {
            t.none(queries.insertUserGoogle, [
              profile.id,
              profile.emails[0].value,
              profile.name.givenName,
              profile.name.familyName,
              profile.displayName
            ])
          }})
          .catch(err => console.log(err))

SQL

const insertUser = 'INSERT INTO users (google_id) 
    VALUES ($1) 
    ON CONFLICT (google_id) DO NOTHING
    RETURNING user_id';

const insertUserGoogle = 'INSERT INTO users_google (google_id, email, first_name, last_name, display_name) 
    VALUES ($1, $2, $3, $4, $5)';
Теги:
pg-promise

1 ответ

2
Лучший ответ

Я автор pg-обещания.


Вы не можете объединить обещания, возвращаемые методами запроса, которые, в свою очередь, выполняют их вне контекста задачи, что приводит к этой ошибке.

Вот правильный способ сделать это:

db.task(t => {
    return t.oneOrNone(queries.insertUser, [profile.id])
        .then(id => {
            if (id) {
                return t.none(queries.insertUserGoogle, [values])
            }
        })
})
    .catch(err => {
        console.log(err);
    });

Обещания всегда должны быть цепочки. И в контексте задачи они должны быть привязаны к задаче.

Несоблюдение этого требования приводит к разрыву обещаний и в контексте задачи базы данных - запросы запросов на запросы, которые пытаются выполнить после завершения задачи и освободили ее соединение.

Кроме того, хороший подход - использовать .catch для результата задачи, как показано, а не внутри задачи.

Другие советы

  • Поскольку оба ваших запроса внутри задачи являются вставками, возможно, вы должны использовать метод tx для транзакции, а не задачу, если вам нужна целостность данных.
  • Это делает гораздо более чистый и эффективный код для хранения SQL во внешних файлах и вместо этого обращается к ним как к файлам запросов. Смотрите также: pg-prom-demo.

ОБНОВИТЬ

Однако, если ваша задача использует генератор, вам не нужно ничего цепляться внутри задачи:

db.task(function* (t) {
    const id = yield t.oneOrNone(queries.insertUser, [profile.id]);
    if (id) {
        yield t.none(queries.insertUserGoogle, [values]);
    }
})
    .catch(err => {
        console.log(err);
    });

... вы только цепляете результат задачи.

ОБНОВИТЬ

В версии 6.5.4 сообщение об ошибке было реорганизовано в Querying against a released or lost connection.

  • 0
    Спасибо! Это было очень полезно.
  • 0
    @ Matt Добро пожаловать, и смотрите раздел ОБНОВЛЕНИЕ;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню