Postgresql pg承诺-使用批处理时无法接收回db响应

Postgresql pg承诺-使用批处理时无法接收回db响应,postgresql,pg-promise,Postgresql,Pg Promise,当我使用tx.batch时,我试图从数据库中获取响应 谢谢 1) 查询数据库中需要更新的现有记录 2) 使用来自1的结果,对db进行另一个批处理调用,以 创建或更新记录 3) 以状态200回复my api,并创建记录和 更新纪录 批处理调用不起作用,已验证的记录被插入或/或更新到数据库中 db.tx(t1 => { let queryCheck = []; reqData.forEach(obj => { for (let key in obj)

当我使用tx.batch时,我试图从数据库中获取响应

谢谢

  • 1) 查询数据库中需要更新的现有记录
  • 2) 使用来自1的结果,对db进行另一个批处理调用,以 创建或更新记录
  • 3) 以状态200回复my api,并创建记录和 更新纪录
批处理调用不起作用,已验证的记录被插入或/或更新到数据库中

 db.tx(t1 => {
    let queryCheck = [];

    reqData.forEach(obj => {
      for (let key in obj) {
        obj[key].resovledURLs.forEach(data => {
          queryCheck.push(
            t1.any(
              `SELECT * FROM testDB WHERE url='${key}' AND testurl='${data}';`
            )
          );
        });
      }
    });

    return t1
      .batch(queryCheck)
      .then(data => {

        return t1.tx(t2 => {
          let t2QueryBatch = [];

         // got rid of queryBatchOfEverything()
         // uses data from t1.batch(queryCheck) to make joinedArray
         let joinedArray = updateArray.concat(createArray);

          joinedArray.forEach(obj => {
            if (obj.queryType === "Update") {
              t2QueryBatch.push(
                t2.none(
                  `UPDATE testDB SET count = count + 1 WHERE url='${
                    obj.url
                  }' AND errorurl='${obj.testurl}';`
                )
              );
            } else {
              t2QueryBatch.push(
                t2.none(
                  `INSERT INTO testDB (url, testurl) VALUES ('${
                    obj.url
                  }', '${obj.testurl}');`
                )
              );
            }
          });

          return t2.batch(t2QueryBatch);
        });
      })
      .then(data => {
        console.log(data);
      });
  });

您的代码显示了如此多的问题,因此不可能就确切的问题提供建议。在进行进一步诊断之前,您需要彻底修改代码

代码中立即可以注意到的问题。。。 问题1 您忘记将
queryBatchOfEverything
链接到包含它的事务,即如果这是您的事务逻辑,那么它应该是
返回queryBatchOfEverything…

问题2 在
db
对象上打开一个嵌套事务,该事务无效,即在另一个事务中不能创建独立的顶级事务

您只能从父事务的上下文(即
t1.tx(t2=>{})
)在那里创建子事务,即
savepoint

问题3 您忘记了将嵌套事务的结果链接到父事务中,因此您将面临另一个松散的承诺。它需要
返回t1.tx(t2=>)

问题4 您在嵌套事务中使用方法
one
,这意味着您只需要返回一行数据,而您的任何查询都不会返回任何内容,即您应该在那里使用方法
none
。这正是你所问的问题。但你需要修复其余部分,以使整个系统正常工作

问题5 您不会将
t2.batch
链接到事务,从而创建另一个松散的承诺。它应该是
返回t2。批处理

问题6 这不是问题,只是一些无用的代码:

let updateRecords = await t1.batch(queryCheck).then(data => {
    return data;
});
与此完全相同:

let updateRecords = await t1.batch(queryCheck);

感谢您指出我的错误,我想我已经完成了您提到的所有更改,因此我不再收到错误消息,但现在我收到:[null,null,null]。我哪里做错了?@DavidTrinh如果返回
batch[none,none,none]
,它将像预期的那样解析为
[null,null,null]
,因为
none
在成功时解析为
null