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

时间:2017-06-09 16:37:32

标签: javascript sql node.js postgresql pg-promise

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

1 个答案:

答案 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,如图所示,而不是在任务内部。

其他提示

  • 由于任务中的两个查询都是插入的,因此如果您关心的是数据完整性,那么您可能应该使用方法tx进行事务处理,而不是task
  • 它使得更清晰,更高效的代码可以将SQL存储在外部文件中,并以Query Files的形式访问它们。另见:pg-promise-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