首页 > 解决方案 > 错误:交易被拒绝,非错误:未定义

问题描述

我正在使用 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)
    }
}

标签: node.jsoracleknex.js

解决方案


此代码可能需要一些工作。:) 这里有一些弹出的东西:

  • 你不需要coq不再需要。Promise 和 async/await 是内置的,使用起来更简单。如果抛出错误,异步函数会自动返回将使用返回的值或拒绝的值来解决的承诺。在此处了解异步/等待:https ://jsao.io/2017/07/how-to-get-use-and-close-a-db-connection-using-async-functions/
  • 您不应该将成功作为字符串返回。如果函数在没有抛出异常的情况下完成,则暗示成功。我看到人们不时这样做,但通常是出于错误的原因。
  • 您不应该在返回承诺的函数中接受回调,它应该是一个或另一个。您的函数的调用者将传递一个回调或等待它的完成。
  • 如果你打算使用回调,那么你应该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。


推荐阅读