Javascript 过期连接之外的松动请求

Javascript 过期连接之外的松动请求,javascript,sql,node.js,postgresql,pg-promise,Javascript,Sql,Node.js,Postgresql,Pg Promise,我正在尝试执行以下查询,但收到此错误: 过期连接之外的松动请求 查询实际上成功了,但即使如此,我还是希望消除错误消息 pg承诺查询 db.task(t => { t.oneOrNone(queries.insertUser, [profile.id]) .then(id =>{ if (id) { t.none(queries.insertUserGoogle, [ p

我正在尝试执行以下查询,但收到此错误:

过期连接之外的松动请求

查询实际上成功了,但即使如此,我还是希望消除错误消息

pg承诺查询

 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)`;
我是这本书的作者


您无法链接查询方法返回的承诺,而查询方法又在任务上下文之外执行这些承诺,从而导致该错误

以下是正确的方法:

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

其他提示

  • 由于任务中的两个查询都是insert,如果您关心数据的完整性,那么您可能应该使用方法进行事务,而不是
  • 它使得将SQL存储在外部文件中并作为替代文件访问这些文件的代码更干净、更高效。另见:
更新

但是,如果任务使用生成器,则不需要在任务内链接任何内容:

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);
    });
…您只会将任务的结果链接起来

更新


在版本中,错误消息被重构为
查询已释放或丢失的连接

谢谢!这非常有帮助。@Matt不客气,请参阅更新部分;)