gpt4 book ai didi

javascript - JS - Knex,将函数传递给 Transaction

转载 作者:行者123 更新时间:2023-12-03 02:05:25 25 4
gpt4 key购买 nike

我创建了一个使用 knex 库进行数据库操作的 node.js 应用程序。数据库是Microsoft SQL Server。我创建了一个名为 db.js 的脚本,它返回 knex 对象,并且我有一个controller.js 脚本来执行实际需要的数据库操作。我将所有操作都包含在翻译语句中,这让我想到了我的问题。我想做的是传递一个参数来告诉事务回滚或提交。然而,每当我尝试传递这个函数时,它就会失败。有谁知道这个功能是否可以实现?我可以使用 catch 函数来实现此功能。

我不认为它是特定于数据库的,因此任何人都可以下载 knex,将其连接到数据库并使用下面的代码进行尝试。

示例.js

/**
* @param {userID} Int
* @param {rollback} Boolean
*/
const getUsers = (userID, rollback) => {
// Using tran as a transaction object:
return db('master').transaction((tran) => {
db('master')
.select()
.from('users')
.where({ 'user_id': userID })
.transacting(tran)
.then(tran.rollback) // Works
// .then(transact(tran, rollback)) throws error
.catch((error) => {
logError(error, tran); // Works
});
// .catch(tran.rollback);
});
};
const logError = (error, transaction) => {
transaction.rollback;
console.log('transaction error: ',error);
console.log('transaction log: ',transaction);
};
const transact = (transaction, rollback) => {
try {
if (rollback) return transaction.rollback;
else return transaction.commit;
} catch (error) {
console.log(error);
}
};
const user = await getUsers(1, true); // error is thrown
assert.strictEqual(user.constructor === Array, true);
assert.strictEqual(user.length == 0, true);

错误信息

Error: the array [   {
"user_id": 1
"user_name": "JonnyBoy"
"zip": 1200
"email": "jjboy@test.com"
} ] was thrown, throw an Error :)

最佳答案

then 将函数作为其第一个参数。如果 Promise 解析,则会使用 Promise 解析到的值调用传递给 then 的函数。事务对象上的 rollback 属性是一个函数,因此您可以编写:

someQuery().then(trans.rollback)

rollback 将在 someQuery 解析时调用。你也可以这样写:

someQuery.then(result => trans.rollback(result))

这些语句是等效的。

也就是说,您至少需要进行两项更改。第一,修复调用 transact 的方式。例如:

.then(() => transact(tran, rollback))

并更改transact调用rollback的方式:

const transact = (trx, rollback) => {
const action = rollback ? trx.rollback : trx.commit
return action()
}

还要记住,rollback 本身将返回一个被拒绝的 Promise,并带有一般错误。您可以将自定义错误传递给 rollback,它会拒绝该错误。

关于javascript - JS - Knex,将函数传递给 Transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com