Ошибка произвольного отклонения: запрос транзакции уже выполнен - ​​knex, express.js - PullRequest
0 голосов
/ 04 декабря 2018

Сначала я пытался проверить значение в таблице, и, если оно существует, удалить строку в другой таблице и вставить эти новые данные в эту таблицу.

Я использовал транзакцию с выбором,del () и команда вставки

db.transaction(trx => {
  return trx('users')
    .where({ username: user.username })
    .select('username')
    .returning('username')

    .then(retData => {
      retUserName = retData[0];

      db('profile')
        .where({ username: user.username })
        .del()
        .then(retData => {
          return trx
            .insert(profileData)
            .into('profile')
            .returning('*');
        });
    })
    .then(retData => {
      res.json({ ProfileData: profileData });
    })
    .then(trx.commit)
    .catch(trx.rollback);
}).catch(err => res.status(400).json('unable to create profile'));

Я получаю эту ошибку. Ошибка произвольного отклонения: запрос транзакции уже выполнен

, но данные не были добавлены в таблицу.

1 Ответ

0 голосов
/ 05 декабря 2018

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

https://knexjs.org/#Transactions

Выдает ошибкуНепосредственно из обработчика транзакции функция автоматически откатывает транзакцию, так же, как и возвращение отклоненного обещания.

Обратите внимание, что если обещание не возвращено в обработчике, вы должны убедиться, что trx.commit или trx.rollback вызывается, в противном случае соединение транзакции будет зависать.

В вашем коде вы смешиваете эти два различных способа использования транзакций, что приводит к его фиксации / откату дважды.

...