使用async/await提交/回滚knex事务

Nik*_*des 6 javascript async-await knex.js

我正在测试使用此模块驱动ES7异步/等待提议来模拟它.我正在尝试让knex.js交易与他们合作,作为一个起点.

示例代码:

async function transaction() {
  return new Promise(function(resolve, reject){
    knex.transaction(function(err, result){
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  });
}

// Start transaction from this call

insert: async (function(db, data) {
 const trx = await(transaction());
 const idUser = await(user.insertData(trx, data));

 return {
    idCidUserstomer: idUser
  }
})
Run Code Online (Sandbox Code Playgroud)

如何commit()rollback()如果交易成功或失败?

Ale*_*min 8

您可能能够通过与此类似的方式实现此目的

function createTransaction() {
  return new Promise((resolve) => {
    return knex.transaction(resolve);
  });
}

async function() {
  const trx = await createTransaction();
  ...
  trx.commit();
}
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试的其他一切都失败时,这就有用 (4认同)

Lan*_*ard 2

以这个Knex Transaction 和 Promises为基础,看起来应该是这样的:

// assume `db` is a knex instance

insert: async (function(db, data) {
  const trx = db.transaction();
  try {
    const idUser = await(user.insertData(trx, data));
    trx.commit();
  } catch (error) {
    trx.rollback();
    throw error;
  }

  return {
    idUser: idUser
  }
})
Run Code Online (Sandbox Code Playgroud)