Uri: Programmfluss Node.js (asynchron) regeln

Beitrag lesen

Hallo,

ich bastle noch immer an meiner Webapp und mir macht das asynchrone Verhalten von node.js nach langem mal wieder zu schaffen. Ich war schon so weit, dass ich verschachtelung von Callbacks eine gewisse Kontrolle hinbekommen habe, aber meine Funktionen waren bisher nicht so wahnsinnig komplex.

Ich versuche das Problem mal etwas genauer zu beschreiben, da aus dem Code-Schnipsel unten nicht genau erkennbar wird was ich eigentlich machen möchte:

Ich habe unter anderem folgende Tabellen in meine Datenbank:

Hauskosten( typ_id, Haus_id, jahr, Kosten)

Hauskostentypen( id, Bezeichnung)

Dann habe ich ein langes Formular mit viele Zeilen, wo jeweils ein Select und als Option alle Typbezeichnungen sind und die in Input für die Kosten.

Serverseitig möchte ich dann für jeden Wertepaar(Bezeichnung, kosten) fragen: gib mir die typ_id, wo die bezeichnung x ist und dann füge in typ_id, kosten, jahr und Haus_id) in die Datenbank hinzu. und das eben für mehrere Felderpaare.

Meine Idee war das ganze mit einer Schleife zu Kontrollieren, aber ich weiß nicht wie. Ich habe auch versucht Promises zu verwenden aber damit funktioniert es auch nicht.

//Store house_costs
app.post("/buildings/:id/add_costs", function(req, res){
  var titles = req.body.cost_positions.titles;
                    
  var year = req.body.year;
  var building_id = req.body.building_id;
  var costs = req.body.cost_positions.costs;
          
          var get_house_cost_type_id = function(titles, index) { 
              return new Promise(function(resolve, reject){
                var type;
                var query = "SELECT id FROM re_manager.house_cost_types WHERE designation='"+titles[index]+"';";
                db.execute(query, function(err, result) {
                  var type = result[0].id;
                  resolve(type);
                });
            });
          }
          
          var insert_house_cost = function(type, building_id, year, costs, index){
            return new Promise(function(resolve, reject){
              var query = "INSERT INTO re_manager.house_costs( type, building_id, year, costs)VALUES("+type+", "+building_id+ ", "+year+ ", "+ costs[index]+ ");";
              db.execute(query,function(err) {
                if (err) throw err;
                resolve("inserted row");
              });
              
            });
          }
          var insert_values_loop = function(building_id, year, costs, titles){
            return new Promise(function(resolve, reject){
              for(var i=0; i<titles.length; i++){
                get_house_cost_type_id(titles, i).then(function(type){
                  insert_house_cost(type, building_id, year, costs, i).then(function(result){
                    console.log(result);
                    
                  });
                });
              }
              resolve("inserted_all rows;");
            });
          }
          
    insert_values_loop(building_id, year, costs, titles).then(function(result){
        console.log(result);
        res.redirect("/buildings/"+ building_id);
    });
});

Ich bin noch nicht ganz so fit, was Promises angeht, aber mit Callbacks innerhalb einer for-Schleife ging das eben auch nicht.

Danke auf jeden Fall schon mal im Voraus.

Gruß Uri