Как дождаться выполнения запроса транзакции Express JS?

#mysql #sql #node.js #express #transactions

#mysql #sql #node.js #экспресс #транзакции

Вопрос:

У меня есть цепочка запросов, созданных с использованием транзакции.

  • вставьте нового пользователя. Из результата я получаю idUser
  • вставьте новый адрес. Из результата я получаю idAdress.
  • вставьте новый user_address (используя idUser и idAddress).

Поэтому мне нужно дождаться продолжения каждого выполнения, потому что результат первого запроса не определен!

 connection.beginTransaction(function (err) {
    if (err) {
      next(createError.Unauthorized("Sql query error")); //! or error.message
    }
    var idUser;
    var idAddress;

    //insert user
    sql =
      "INSERT INTO users (email, password) "  
      "VALUES ( ?, ?)";
    param = [email, password];

    connection.query(sql, param, function (error, results, fields) {
        if (error) {
        connection.rollback(function () {
          return next(createError.Unauthorized("Sql query error")); 
        });

        //MY TEST: results is undefined
        console.log(results);

        //get the id
        idUser = results.insertId; 

        //insert user
        sql =
          "INSERT INTO addresses (country, city) "  
          "VALUES ( ?, ?)";
        param = [country, city];

        connection.query(sql, param, function (error, results, fields) {
            if (error) {
            connection.rollback(function () {
              return next(createError.Unauthorized("Sql query error")); 
            });

            // get the id
            idAddress = results.insertId;

            //insert user_address
            sql =
              "INSERT INTO user_address (idUser, idAddress) "  
              "VALUES ( ?, ?)";
            param = [idUser, idAddress];

            connection.query(sql, param, function (error, results, fields) {
                if (error) {
                connection.rollback(function () {
                  return next(createError.Unauthorized("Sql query error")); 
                });

                //commit
                connection.commit(function (err) {
                    if (err) {
                        connection.rollback(function () {
                          next(createError.Unauthorized("Sql query error")); 
                    });
                });
        
            });

        });
    
    });

});
  

Комментарии:

1. При этом используется код обратного вызова. Действительно пора переключиться на использование Promises и async / await или as, это значительно облегчит вашу жизнь. Еще лучше, используйте функции со стрелками, например (...) => { ... } , в предпочтении к function(...) { ... }

2. ye @tadman ты знаешь, как это реализовать с помощью Promises ?!

3. Я бы рекомендовал использовать что-то вроде Sequelize для вашего уровня базы данных, и он изначально поддерживает promises. Многие другие драйверы работают так же, поэтому вам придется проверить документацию для того, который вы используете.