我正在使用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)
}
}
答案 0 :(得分:1)
此代码可能需要一些工作。 :)弹出的几件事:
co
或q
。 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/ 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有关。