如何使用knex.js使用事务

时间:2017-12-12 17:14:48

标签: mysql node.js knex.js

我使用knex在数据库表中输入多个刻录机,但我没有任何响应。我的代码如下:

  addApi : (data,CustomerId) => {
    knex.transaction(function(trx) {
      knex('books').transacting(trx).insert({name: 'Old Books'})
        .then(function(resp) {
          var id = resp[0];
          return someExternalMethod(id, trx);
        })
        .then(trx.commit)
        .catch(trx.rollback);
    })
    .then(function(resp) {
      console.log('Transaction complete.');
    })
    .catch(function(err) {
      console.error(err);
    });
  }

1 个答案:

答案 0 :(得分:1)

从您的问题来看,我假设交易成功,尽管您没有获得返回值。

您丢失了return someExternalMethod(id, trx);响应值。相反,您将获得.then(trx.commit)的响应值。并且您在console.log('Transaction complete.');代码部分再次执行相同操作。

试试这个(编辑:现在测试代码):

function testIt() {
    const knex  = require("knex")(dbcfg); // you will need your configuration

    function createBooksTable(table) {
        table.increments('id');
        table.string('name', 128);
    };

    function someExternalMethod(id, trx) {
        console.log("DBG02 .someExternalMethod Executed.");
        return [id];
    }

    function insertBooksRec() {
        return knex.transaction(function(trx) {
            knex('books').transacting(trx).insert({name: 'Old Books'})
            .then(function(resp) {
            var id = resp[0];
            return someExternalMethod(id, trx);
            })
            .then(function(extMethodReturn) {
            // return the value from the above .then
            console.log('DBG03 .extMethodReturn Returns:', extMethodReturn);
            return trx.commit()
                .then(function() { 
                    console.log('DBG04 .extMethodReturn Returns:', extMethodReturn);
                    return extMethodReturn; 
                });
            })
            .catch(trx.rollback)
            .then(function(resp) {
                console.log('DBG99 Insert Transaction complete. Returns:', resp);
                return resp; // if you want the value returned.
            })
            .catch(function(err) {
                console.error('DBG89 Insert Transaction ERROR:', err);
            });
        });
    };

    let tbl = knex.schema.createTableIfNotExists("books", createBooksTable)
    .then(function() {
        console.log('DBG01 BOOKS Table Creation complete:');
    })
    .catch(function(err) {
        console.error("DBG81 ERROR creating books table:", err);
    })
    .then(function() {
        return insertBooksRec()
    });

};
testIt();