【问题标题】:Unhanded rejection error :Transaction query already complete - knex, express.js未经处理的拒绝错误:交易查询已经完成 - knex,express.js
【发布时间】:2018-12-04 18:13:12
【问题描述】:

我试图首先检查表中的值,如果存在,则删除另一个表中的一行并将新数据插入该表中。

我使用了一个带有 select、del() 和 insert 命令的事务

db.transaction(trx => {
  return trx('users')
    .where({ username: user.username })
    .select('username')
    .returning('username')

    .then(retData => {
      retUserName = retData[0];

      db('profile')
        .where({ username: user.username })
        .del()
        .then(retData => {
          return trx
            .insert(profileData)
            .into('profile')
            .returning('*');
        });
    })
    .then(retData => {
      res.json({ ProfileData: profileData });
    })
    .then(trx.commit)
    .catch(trx.rollback);
}).catch(err => res.status(400).json('unable to create profile'));

我收到此错误未经处理的拒绝错误:事务查询已完成

但数据尚未添加到表中。

【问题讨论】:

    标签: express knex.js


    【解决方案1】:

    您正在从事务处理程序回调中返回承诺,这会导致事务自动提交/回滚,具体取决于返回的承诺是否解析/拒绝。

    https://knexjs.org/#Transactions

    直接从事务处理函数抛出错误 自动回滚事务,与返回被拒绝的事务相同 承诺。

    请注意,如果在处理程序中没有返回一个 Promise,它就是 up 确保调用 trx.commit 或 trx.rollback,否则 交易连接将挂起。

    在您的代码中,您混合使用这两种不同的方式来使用事务,这会导致它被提交/回滚两次。

    【讨论】:

      【解决方案2】:

      我遇到了不同的情况但同样的错误。也许它可以帮助某人。

      knex.transaction(async (t) => {
      ...
      

      使用异步函数会产生同样的效果..

      成功了

      knex.transaction((t) => {
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 2020-07-08
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多