Knex Transaction with Promises

前端 未结 1 654
梦谈多话
梦谈多话 2020-12-03 01:55

I am getting the correct output, and indeed, these two operations are being treated as a single transactional unit; where if one fails, both fail.

In this code examp

相关标签:
1条回答
  • 2020-12-03 02:09

    You need to return a promise from the inner query in order for the outer chain to be chained with that.

    You also swallow any errors because you don't rethrow them - it's better to use .catch() for this reason because it makes it more clearer what is happening - that is what would happen with normal try-catch statement.

    knex.transaction(function(t) {
       return knex('foo')
       .transacting(t)
       .insert({id:"asdfk", username:"barry", email:"barry@bar.com"})
       .then(function() {
            return knex('foo')
               .where('username','=','bob')
               .update({email:"bob@foo.com"});
       })
       .then(t.commit)
       .catch(function(e) {
            t.rollback();
            throw e;
       })
    })
    .then(function() {
     // it worked
    })
    .catch(function(e) {
     // it failed
    });
    

    To understand it better, here's the synchronous version that is being "emulated":

    try {
        var t = knex.transaction();
        try {
            knex("foo")
                .transacting(t)
                .insert({id:"asdfk", username:"barry", email:"barry@bar.com"});
            knex("foo")
                .where('username','=','bob')
                .update({email:"bob@foo.com"});
            t.commit();
        }
        catch (e) {
            t.rollback();
            // As you can see, if you don't rethrow here
            // the outer catch is never triggered
            throw e;
        }
        // It worked
    }
    catch (e) {
        //It failed
    }
    
    0 讨论(0)
提交回复
热议问题