错误:交易被拒绝,没有错误:未定义

时间:2019-08-30 10:42:02

标签: node.js oracle knex.js

我正在使用knex npm版本0.15.2。回滚事务时出现以下错误:

  

错误:交易被拒绝,错误为:未定义

Trx.rollback()

用于回滚的功能。

适用于knex版本0.12.6的相同代码

这是我用于提交/回滚的功能。

function Commit(pTrx, pIsCommit, pCallback) {
    try {
        var co = require("co");
        var q = require('q');
        var Q = q.defer();
        co(function* () {
            if (pIsCommit) {
                yield pTrx.commit();
            } else {
                yield pTrx.rollback();
            }
            Q.resolve(pCallback('SUCCESS'));
        }).catch(function (error) {
            Q.reject(pCallback(error));
        });
        return Q.promise;
    } catch (error) {
     console.log(error)
    }
}

1 个答案:

答案 0 :(得分:1)

此代码可能需要一些工作。 :)弹出的几件事:

  • 您不再需要coq。 Promise和async / await是内置的,使用起来更简单。异步函数自动返回承诺,如果抛出错误,将使用返回值或拒绝的值来解决承诺。在此处了解有关异步/等待的信息:https://jsao.io/2017/07/how-to-get-use-and-close-a-db-connection-using-async-functions/
  • 您不应该以字符串形式返回成功。如果函数完成而没有引发异常,则表示成功。我看到人们不时这样做,但这通常是出于错误的原因。
  • 在返回promise的函数中,您不应该接受回调,它应该是一个或另一个。函数的调用者将通过回调或等待其完成。
  • 如果要使用回调,则成功时应返回null作为第一个参数。请在此处查看最后一句话:https://nodejs.org/en/knowledge/getting-started/control-flow/what-are-callbacks/
  • 您的函数名称Commit以大写字母开头。此约定通常用于指示该函数是构造函数,并打算用new关键字调用。

以下是清理后该函数的外观:

async function commit(pTrx, pIsCommit) {
  // Not using a try/catch. If an error is thrown the promise returned will be rejected.
  if (pIsCommit) {
    await pTrx.commit();
  } else {
    await pTrx.rollback();
  }
  // Not going to return anything. If we get to this point then success is implied when the promise is resolved.
}

函数的使用者将使用类似以下内容的函数来调用它:

async function myWork() {
  // do work; get pTrx

  try {
    await commit(pTrx, true);
    // If I get here, then I can assume commit was successful, no need to check a return value of 'SUCCESS'
  } catch (err) {
    // handle error
  }
}

很难说当前状态的代码出在哪里。但是,如果问题确实出在Knex上,那么您可能应该将此事作为问题发布到Knex仓库中:https://github.com/tgriesser/knex/issues,但是您应该编写一个可重现的测试用例,以证明其与Knex有关。