Javascript JS-Knex,将函数传递给事务

Javascript JS-Knex,将函数传递给事务,javascript,promise,knex.js,Javascript,Promise,Knex.js,我创建了一个node.js应用程序,它使用knex库进行数据库操作。数据库是Microsoft SQL Server。我创建了一个名为db.js的脚本来返回knex对象,还有一个controller.js脚本来执行实际需要的数据库操作。我把所有的操作都包装在翻译语句中,这就引出了我的问题。我想做的是传入一个参数,告诉事务回滚或提交。但是,每当我尝试传入此函数时,它都会失败。有人知道这个功能是否可以实现吗?我可以用catch函数实现这个功能 我不认为它的db是特定的,所以任何人都可以下载knex,

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

我不认为它的db是特定的,所以任何人都可以下载knex,把它连接到一个db,然后用下面的代码给它一个机会

example.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 :)
然后将函数作为其第一个参数。如果承诺解析,则将使用承诺解析的值调用传递给的函数。事务对象上的回滚属性是一个函数,因此您可以编写:

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()
}