在过期的连接之外放松请求

我正在尝试执行以下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)`; 

我是pg-promise的作者。


您无法链接查询方法返回的promise,而这些promise又会在task context中执行,这会导致错误。

这是正确的做法:

 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-promise-demo 。

UPDATE

但是,如果你的任务使用了一个生成器,那么你不需要在任务内部链接任何东西:

 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); }); 

…你只能链接任务的结果。

UPDATE

在版本6.5.4中 ,错误消息被重构为Querying against a released or lost connection