我正在尝试执行以下pg-promise查询,但收到此错误:
在过期连接之外的松散请求
查询实际上是成功的,但是,即使这样,我也想摆脱错误信息。
pg-promise查询
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)`;
答案 0 :(得分:2)
我是pg-promise的作者。
您无法链接查询方法返回的promise,而后者又会在任务上下文之外执行它们,从而导致该错误。
这是正确的方法:
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);
});
Promise必须始终链接。在任务的背景下,他们必须被束缚在任务中。
如果不这样做会导致承诺松散,并且在数据库任务的上下文中 - 在任务完成并尝试执行并释放其连接之后尝试执行的松散查询请求。
另外,一个好方法是对任务结果使用.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
。