Как использовать откат, если в узле js есть транзакции API mysql и restfull - PullRequest
0 голосов
/ 25 октября 2019

У меня есть какая-то транзакция в узле js, первая - это выбор данных из таблицы mysql (таблица: клиенты), вторая - вставка данных в таблицу mysql (таблица: клиенты), третья - отправка данных и сохранение с использованием restfull API. и последнее - вставка данных в таблицу mysql (таблица: generate_spks), я хочу применить откат в моем узле js.

Я пробовал вот так, но если последняя транзакция завершилась неудачно (вставка в таблицу generate_spks), данные, которые я отправляю и сохраняю с помощью API restfull, сохраняются (все еще работают), даже если они не должны отправляться, потому что последняя транзакция не удалась.

Я пробовал, как эта ссылка https://github.com/mysqljs/mysql#transactions

это мой db.js

var mysql = require("mysql");

function Connection() {

    this.pool = null;

    var konek = {
        host: '19*.16*.**.***',
        user: 'my_user',
        password: 'my_password',
        database: 'my_database'
    };

    this.init = function() {
        this.pool = mysql.createPool(konek);
    }

    this.acquire = function(callback) {
        this.init();
        this.pool.getConnection(function(err, connection) {
            callback(err, connection);
        });
    };
}
module.exports = new Connection();

, и это мой controller

var connection = require('../../config/db');

function Todo() {

this.insertSpkBranchNo = function(req, res, next) {
    var id = uuidv1();
    var cust_code = 'C-0001'
    var cust_nama = req.body.cust_nama;
    var cust_noktp = req.body.cust_noktp;
    var cust_kk = req.body.cust_kk;
    var created = new Date();
    var modified = new Date();

    connection.acquire(function(err, con) {
      con.beginTransaction(function(){
        con.query('SELECT cust_code FROM customers ORDER BY cust_code desc LIMIT 1', function(err, result){
           if (err) {
              con.rollback(function(){
              console.log(err);
              res.send({ status: 400, message: 'Select Customer Code Failed' });
              });
           } 

           con.query('INSERT INTO customers (id,cust_code,cust_nama,cust_noktp,cust_kk,created,modified) VALUES (?,?,?,?,?,?,?)', [id,cust_code,cust_nama,cust_noktp,cust_kitas,created,modified], function(err, result) {
               if (err) {
                  con.rollback(function(){
                  console.log(err);
                  return res.send({ status: 400, message: 'Insert Customer Failed' });
                  });
               } 

               var url = 'http://45.**.***.***/api-dev/api_insert_customer.php';

               var requestData = {
                   id:id,
                   cust_code:cust_code,
                   cust_nama:cust_nama,
                   cust_noktp:cust_noktp,
                   created:created, 
                   modified:modified,
                   cust_kk:cust_kk,
                }

                var data = {
                   url: url,
                   auth: {
                   bearer: '71D55F99*****'
                   },
                json: true,
                form: requestData,
                rejectUnauthorized: false, //add when working with https sites
                requestCert: false, //add when working with https sites
                agent: false, //add when working with https sites
               }

               request.post(data, function(err, httpResponse, body) {
                  if (body.status == "0") {
                     con.rollback(function(){
                     console.log(err);
                     return res.send({ status: 400, message: 'Send customer to dms Failed' });
                     });
                   }  

                   var id = uuidv1();
                   var id_customer = req.body.id_customer;
                   var cust_nama = req.body.cust_nama;
                   var cust_alamat = req.body.cust_alamat;
                   var cust_hp = req.body.cust_hp;
                   var cust_telp = req.body.cust_telp;
                   var cust_npwp = req.body.cust_npwp;

                   con.query('INSERT INTO generate_spks (id, id_customer, cust_nama, cust_alamat, cust_hp, cust_telp, cust_npwp) VALUES (?,?,?,?,?,?,?)', [id, id_customer, cust_nama, cust_alamat, cust_hp, cust_telp, cust_npwp], function(err, result) {
                      if (err) {
                         con.rollback(function(){
                         console.log(err);
                         return res.json({ status: 400, message: 'Insert spk failed' });
                         });
                       }

                       con.commit(function(err) {
                          if (err) { 
                            con.rollback(function() {
                            console.log(err);
                            return res.json({ status: 400, message: 'Commit failed' });
                            });
                           } else {
                             return res.json({ status: 200, message: 'success' });
                           }
                      });

                   });

                 });

              });

            });   

          });

          console.log('Transaction Complete.');
          con.end();
        });
    };
}

module.exports = new Todo();

Я хочу, если последняя транзакция (вставка в таблицу generate_spks) не удалась,третья транзакция (с использованием restfull API) не будет сохранена.

Мой код неверен? любая помощь ценится. Спасибо ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...