Javascript JS-Knex,将函数传递给事务
我创建了一个node.js应用程序,它使用knex库进行数据库操作。数据库是Microsoft SQL Server。我创建了一个名为db.js的脚本来返回knex对象,还有一个controller.js脚本来执行实际需要的数据库操作。我把所有的操作都包装在翻译语句中,这就引出了我的问题。我想做的是传入一个参数,告诉事务回滚或提交。但是,每当我尝试传入此函数时,它都会失败。有人知道这个功能是否可以实现吗?我可以用catch函数实现这个功能 我不认为它的db是特定的,所以任何人都可以下载knex,把它连接到一个db,然后用下面的代码给它一个机会 example.jsJavascript JS-Knex,将函数传递给事务,javascript,promise,knex.js,Javascript,Promise,Knex.js,我创建了一个node.js应用程序,它使用knex库进行数据库操作。数据库是Microsoft SQL Server。我创建了一个名为db.js的脚本来返回knex对象,还有一个controller.js脚本来执行实际需要的数据库操作。我把所有的操作都包装在翻译语句中,这就引出了我的问题。我想做的是传入一个参数,告诉事务回滚或提交。但是,每当我尝试传入此函数时,它都会失败。有人知道这个功能是否可以实现吗?我可以用catch函数实现这个功能 我不认为它的db是特定的,所以任何人都可以下载knex,
/**
* @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 :)
然后将函数作为其第一个参数。如果承诺解析,则将使用承诺解析的值调用传递给的函数。事务对象上的回滚属性是一个函数,因此您可以编写:
someQuery().then(trans.rollback)
当someQuery解析时,将调用rollback。你也可以写:
someQuery.then(result => trans.rollback(result))
这些陈述是等价的
也就是说,至少需要做两个更改。第一,修正你调用transact的方式。例如:
.then(() => transact(tran, rollback))
并更改transact调用回滚的方式:
还要记住,回滚本身将返回一个被拒绝的承诺,并带有一个一般性错误。您可以将自定义错误传递给回滚,它将使用该错误进行拒绝。错误说明了什么?@Mark\M,添加了错误。
const transact = (trx, rollback) => {
const action = rollback ? trx.rollback : trx.commit
return action()
}