Я пытаюсь выполнить следующий запрос 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-обещания.
Вы не можете объединить обещания, возвращаемые методами запроса, которые, в свою очередь, выполняют их вне контекста задачи, что приводит к этой ошибке.
Вот правильный способ сделать это:
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
для результата задачи, как показано, а не внутри задачи.
Другие советы
ОБНОВИТЬ
Однако, если ваша задача использует генератор, вам не нужно ничего цепляться внутри задачи:
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
.