Unhanded rejection error :Transaction query already complete - knex, express.js

笑着哭i 提交于 2019-12-11 08:27:45

问题


I was trying to check for a value in a table first, and if it exists, delete a row in another table and insert this new data into that table.

I used a transaction with a select, del(), and a insert command

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'));

I get this error Unhanded rejection error:Transaction query already completed

but the data hasn't been added to the table.


回答1:


You are returning promise from transaction handler callback, which causes transaction to automatically committed / rolled back depending if returned promise resolves / rejects.

https://knexjs.org/#Transactions

Throwing an error directly from the transaction handler function automatically rolls back the transaction, same as returning a rejected promise.

Notice that if a promise is not returned within the handler, it is up to you to ensure trx.commit, or trx.rollback are called, otherwise the transaction connection will hang.

In your code you are mixing those two different ways to use transactions, which causes it to be committed / rolledback twice.



来源:https://stackoverflow.com/questions/53619101/unhanded-rejection-error-transaction-query-already-complete-knex-express-js

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!