Где разместить блок фиксации сложной транзакции NodeJS MySQL?

#javascript #mysql #node.js #node-mysql #nodejs-server

Вопрос:

У меня есть следующий код в NodeJS, который хорошо работает для;

  1. Начните транзакцию MySQL;
  2. Создайте аудиопост;
  3. Обновите аудиопост.
  4. Проверьте, существует ли tag1, а если нет, создайте его и вставьте в таблицу тегов. Если он существует, просто вставьте его в таблицу тегов.
  5. Зафиксируйте транзакцию;

Но теперь я хотел бы также проверить наличие tag2 и tag3. К сожалению, я не могу понять, где и как разместить блок фиксации, чтобы сохранить все это как единую транзакцию.

Если я поставлю его непосредственно перед закрытием проверки на «tag1», код не дойдет до «tag2» и «tag3». Но если я поставлю это после, то закрывающие скобки в запросах на подключение окажутся в неправильном месте. Вот код;

 var mysql   = require("mysql");
var express = require("express");
var connection = require("../database");


 var createAudiopost = function(req, res, next){
     
 var title = req.body.title;
 var userid = req.body.userid;
 var opid = req.body.opid; 
 var tag1 = req.body.tag1;
 var tag2 = req.body.tag2;
 var tag3 = req.body.tag3;
     
connection.beginTransaction(function(err) {
  if (err) { throw err; }
  
    connection.query('INSERT INTO ?? (title,userid,opid) VALUES (?, ?, ? )', ['audioposts',title,userid,opid], function(err, result) {
     if (err) { 
      connection.rollback(function() {
        throw err;
      });
    }

    var audioname = userid   '-'   result.insertId   '.m4a';
    var newid = result.insertId;    
    console.log("newid: "  , newid  );
    
    connection.query('UPDATE ?? SET audioname=? WHERE audioid = ?',  ['audioposts',audioname,newid], function (error, result, fields) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
      }  
      
      if (tag1)  {  
        connection.query('SELECT tagid FROM tags WHERE tagname = ?', [tag1], function (error, result, fields) {
                    
                  if (err) { 
                    connection.rollback(function() {
                      throw err;
                    });
                            }                           
                            const tagid1 = result[0].tagid;
        if (result < 1) {   

            connection.query('INSERT INTO tags SET tagname = ?', [tag1], function (error, result, fields) {
                      if (err) { 
                    connection.rollback(function() {
                          throw err;
                            });
                                }   
                                
                        console.log("lets see this ridiculous result", result);
                                                            
                        const tagInsertId = result.insertId;
                    
                connection.query("INSERT INTO entitytag SET audioid = ?, tagid = ?, userid = ?", [newid, tagInsertId, userid], function (error, result, fields) {
                      if (err) { 
                        connection.rollback(function() {
                          throw err;
                            });
                              }  

                connection.commit(function(err) {
                if (err) { 
                  connection.rollback(function() {
                    throw err;
                  });
                }
                 console.log('success!');
                 newid = result.insertId;
                 res.json({
                                "title" : title, 
                                "userid" : userid,
                                "opid" : opid, 
                                "insertid": newid
                        }); //resjson success               
                    }); //commit              
                }); // insert entitytags
            }); // insert tags          
          } // if row
          
          else {                                            
                connection.query("INSERT INTO entitytag SET audioid = ?, tagid = ?, userid = ?", [newid, tagid1, userid], function (error, result, fields) {              
              if (err) { 
                connection.rollback(function() {
                  throw err;
                        }); //err
                        } //err 

                connection.commit(function(err) {
                if (err) { 
                  connection.rollback(function() {
                    throw err;
                  });
                }
                 console.log('success!');
                 res.json({
                                "title" : title, 
                                "userid" : userid,
                                "opid" : opid, 
                                "insertid": newid,
                                "tag1": tag1
                        }); //resjson success               
              }); //commit  
            })  // insert entitytag2
          }
        }); //select tagid
      }//tag1
    }); //update
  }); //insert
}); //begin transaction
}   //createaudiopost
   module.exports = createAudiopost;
 

Есть какие-либо предложения о том, как я могу завершить такую сложную транзакцию? Мне в основном нужно повторить весь раздел if (tag1) для tag2 и tag3.

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

1. Первое, что я бы сделал, чтобы решить эту проблему, — это покинуть ад обратного вызова. Используйте пакет mysql, который поддерживает обещания , и соответствующим образом перепишите свой код. Таким образом, вам будет намного проще организовать свой код.

2. ОК. Итак, я экспериментирую с обещаниями, но как мне получить вставку возвращаемых строк? Вот что я попробовал ; mydb.query( str_sql_1 ) .затем( строки => { row_a = строки; var newid = row_a[0].insertId; верните mydb.query( str_sql_2 ); } )

3. Если я это сделаю const res = await connection.query('INSERT INTO table (`colname`) VALUES (123);'); , я смогу сделать console.log(res[0].insertId); это, чтобы получить новое удостоверение личности. Я предлагаю использовать await , потому что таким образом вы можете писать «синхронный» код и не попадать в проблемы с областью действия.