2016-06-03 12 views
1

So habe ich ein kleines Problem, wenn ich Daten auf der Datenbank speichern, es tut alles OK und gibt das Objekt zurück, wie es sein sollte, aber wenn ich es aus der Datenbank bekomme Es kommt mit einem leeren Array und ich weiß, dass ich dieses Array mit Daten speichern.Mongodb zurückgegeben bevölkertes Objekt, aber leert leere Felder einige Felder

Dies ist der Code:

-Controller

router.post("/semestre", function(req, res) { 
    var req = req; 
    var res = res; 
    console.log("hello! routed to /semestre [create]"); 
    //build needs 
    var newSemestre = new semestreModel(); 
    //fecthing materias 


    newSemestre.nome = req.body.nome; 
    if (req.body.materias.length > 0) { 
     var materias = JSON.parse(req.body.materias); 
     materias.forEach(function(materia, index) { 
      //building needs 
      var newMateria = new materiaModel(); 
      //fechting avaliacoes 
      newMateria.nome = materia.nome; 
      newMateria.avaliacoes = []; 
      if (materia.avaliacoes.length > 0) { 
       materia.avaliacoes.forEach(function(avaliacao, index) { 
        //console.log("avaliacao:" + avaliacao.nome); 
        //building nedds 
        var newAvaliacao = new avaliacaoModel(); 
        newAvaliacao.nome = avaliacao.nome; 
        newAvaliacao.nota = avaliacao.nota; 
        newAvaliacao.save(function(err, availacao) { 
         if (err) { 
          console.log("@semestres [create] - saving avaliacao has error"); 
          res.send({ erro: true, msg: "Oops! alguma coisa está errada!" }); 
         } else { 
          newMateria.avaliacoes.push(avaliacao._id); 
         } 
        }); 
       }); 
      } else { 
       console.log("avaliacoes:[]"); 
      } 

      newMateria.save(function(err, materia) { 
       if (err) { 
        //console.log(err); 
        console.log("@semestres [create] - saving materia has error"); 
        res.send({ erro: true, msg: "Oops! alguma coisa está errada!" }); 
       } else { 
        newSemestre.materias.push(materia._id); 
       } 
      }); 
     }); 
    } 

    newSemestre.save(function(err, semestre) { 
     if (err) { 
      //console.err(err); 
      console.log("saving semestre has error"); 
      res.send({ erro: true, msg: "Oops! alguma coisa está errada!" }); 
     } else { 
      //console.log(semestre); 
      res.send(semestre); 
     } 
    }); 

}); 

Schemen

var materia = { 
    nome: String, 
    notaFinal:Number, 
    semestre_id:String, 
    frequencia:Number 
    }; 
var MateriaSchema = new Schema(materia); 

var model = { 
    nome: String, 
    materias: [String], 
    completo: Boolean 
}; 
var SemestreSchema = new Schema(model); 

var model = { 
    nome: String, 
    materia_id: String, 
    nota: Number 
}; 
var AvaliacaoSchema = new Schema(model); 

Wieder alles funktioniert gut, aber es spart nur ein leeres Array von materias wenn eine Erstellung newSemestre.

+0

Nachdem Sie 'newSemestre.materials.push (materia._id);' ausgeführt haben, können Sie einige Funktionen aufrufen, um 'newSemestre.save' zu ​​tun, was wie erwartet funktioniert. – Shrabanee

+0

Ich mache das am Ende –

+0

Das wird dir nicht helfen. Weil es asynchron ist. Es wird nicht darauf warten, dass die "materia" gespeichert wird, bevor "newsemester" gespeichert wird. Es wird also ein leeres Array geben, das für das Semester gespeichert werden kann. – Shrabanee

Antwort

2

Versuchen Sie, die folgende Art und Weise: -

var newSemestre = new semestreModel(); 
//fecthing materias 

newSemestre.nome = req.body.nome; 
if (req.body.materias.length > 0) 
{ 
    var materias = JSON.parse(req.body.materias); 
    materias.forEach(function(materia, parentIndex) 
    { 
     //building needs 
     var newMateria = new materiaModel(); 
     //fechting avaliacoes 
     newMateria.nome = materia.nome; 
     newMateria.avaliacoes = []; 
     if (materia.avaliacoes.length > 0) 
     { 
      materia.avaliacoes.forEach(function(avaliacao, index) 
      { 
       //console.log("avaliacao:" + avaliacao.nome); 
       //building nedds 
       var newAvaliacao = new avaliacaoModel(); 
       newAvaliacao.nome = avaliacao.nome; 
       newAvaliacao.nota = avaliacao.nota; 
       newAvaliacao.save(function(err, availacao) 
       { 
        if (err) { 
         console.log("@semestres [create] - saving avaliacao has error"); 
         res.send({ erro: true, msg: "Oops! alguma coisa está errada!" }); 
        } else { 
         newMateria.avaliacoes.push(avaliacao._id); 
        } 
       }); 
      }); 
     } 
     else 
     { 
      console.log("avaliacoes:[]"); 
     } 

     newMateria.save(function(err, materia) 
     { 
      if (err) 
      { 
       //console.log(err); 
       console.log("@semestres [create] - saving materia has error"); 
       res.send({ erro: true, msg: "Oops! alguma coisa está errada!" }); 
      } 
      else 
      { 
       newSemestre.materias.push(materia._id); 

       //If the last loop of "foreach" is going on, then only call the function, which will do save. 
       if(parentIndex > req.body.materias.length) 
       { 
         saveSemester(); // call some function 
       } 
      } 
     }); 
    }); 
} 

}); 

Die Funktion hier geht.

Das leere Array, gespeichert, weil bevor Sie versuchen, Semester zu speichern, gibt es keine Daten in diesem Array. Sie müssen also warten, bis der Push ausgeführt wurde, und dann mit dem Speichern fortfahren, wodurch die gewünschten Daten gespeichert werden.

UPDATE

meine Antwort aktualisiert. Die Funktion wird aufgerufen, sobald die letzte Schleife von foreach läuft. Daran könnte ich gerade denken.

Hoffe, das wird helfen.

+0

Ich sehe, werde versuchen, dass, zurück mit dem Ergebnis thx –

+0

so, es ist ein Problem mit dieser Lösung, ich habe eine foreach runing und wenn ich diesen Funktionsaufruf dort, wo Sie vorgeschlagen, wird es jedes Mal die foreach aufgerufen werden läuft, also kann ich das nicht benutzen. –

+0

Verwenden Sie [async - node js] (https://github.com/caolan/async)? Ich verwende Async, um diese Art von Situationen zu behandeln. – Shrabanee

Verwandte Themen