Knex. js возврат транзакцииобещание в обещании - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть функция setClaims, которая просто устанавливает заявки для текущей транзакции. Мне нужно создать вспомогательную функцию, которая будет проверять, был ли указан uuid, устанавливать заявки и возвращать объект транзакции. Примерно так:

export const useAuthTransaction = async (
  kx: Knex,
  setClaims: (tx: Knex.Transaction, uuid?: string) => Promise<any>,
  uuid?: string,
): Promise<Knex.Transaction> => {
  if (!uuid) {
    throw { errorCodes: [RemoveQuestionErrorCode.Unauthorized] };
  }

  return kx.transaction(async tx => {
    await setClaims(tx);
    return tx;
  });
};

Но когда я пытаюсь использовать его в своем преобразователе:

useAuthTransaction(kx, setClaims, claims?.uid).then(async tx =>
  dataSources.questionAPI.update(tx, input));

, он говорит:

Запрос транзакции уже завершен

Как разрешить контекст транзакции, не закрывая его?

1 Ответ

1 голос
/ 27 февраля 2020

Возвращение обещания от обработчика транзакции автоматически фиксирует / отклоняет его.

Таким образом, вы используете обработчик типа async tx => {...}, который неявно всегда возвращает обещание.

Что вы хотите сделать, это использовать функцию knex.transactionProvider() (см. Примеры из документации), а затем Вы можете передать эту транзакцию и явно указать, когда она должна быть зафиксирована / откатана.

...