node.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)
}
}
解决方案
此代码可能需要一些工作。:) 这里有一些弹出的东西:
- 你不需要
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/ - 您的函数名称 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。
推荐阅读
- laravel-8 - 作曲家需要 designmynight/laravel-mongodb-passport 未安装在 laravel8 中
- c# - 失去焦点时自定义文本框值消失
- laravel - 未找到 Laravel 8 路线
- angular - Wait for subscription in the same function
- python - 在时间序列数据帧上仅在 groupby 之后获取序列
- https - HttpService 的 NestJs 超时问题
- amazon-web-services - AWS ASG 错误状态转换原因 Server.InternalError
- xamarin - 如何在 Xamarin 中自定义包含文本的进度条
- docker - 有没有办法将 action.yml 与容器存储库的 GitHub 操作一起使用
- database - 如何在颤动中循环表单数据条目