2015-07-10 7 views
5

Ich arbeite mit Nodejs Express Routen und Mongoose, um Daten zu persistieren. Ich habe den Kern CRUD-Operationen ohne Probleme durchgeführt. Jedoch, wenn ich versuche, einige Operationen auf einem der Felder des Modells durchzuführen und dann versuchen, das Modell mit model.save zu speichern, sagt es über .save() Methode: "undefined ist keine Funktion"Nodejs Mongoose Saving Modell undefined ist keine Funktion

Also, Hier ist der Code. Die Schnipsel-Nummer (1) funktioniert gut:

router.put('/:myId', function (req, res, next) { 
var ourUpdateData = req.body; 
Model.findOne({myId: req.params.myId.toString()}, function (err, foundModel) { 
    if (err) throw err; 

    if (ourUpdateData.fieldA) foundModel.fieldA = ourUpdateData.fieldA; 
    if (ourUpdateData.fieldB) foundModel.fieldB = ourUpdateData.fieldB; 
    if (ourUpdateData.fieldC) foundModel.fieldC = ourUpdateData.fieldC; 
    if (ourUpdateData.fieldD) foundModel.fieldD = ourUpdateData.fieldD; 
    if (typeof ourUpdateData.fieldArray === "object") ourUpdateData.fieldArray = ourUpdateData.fieldArray; 

    foundModel.save(function (err, updatedModel) { 
     if (err) throw err; 
     res.send(updatedmodel); 
    }); 
}); 

});

So hat das Modell 6 Felder: fieldA, .. B, .. C, .. D, myId, um als Index und ein Feld zu identifizieren Array von einigen Werten fieldArray. Das obige Beispiel speichert das Modell, funktioniert gut. Wenn ich jetzt jedoch versuche, etwas mit Array-Feld fieldArray zu tun und dann das Model zu speichern, wirft es mich "undefined ist keine Funktion", wenn ich model.save() verwende. Also das Snippet (2) ist der Code, der diesen Fehler erzeugt:

router.get('/:myId/:addThisToFieldArray', function(req, res, next) { 
    var myId = req.params.myId; 
    var addThisToFieldArray = req.params.addThisToFieldArray; 
    Model.find({myId: myId}, function (err, model) { 
     if (err) throw err; 
     var fieldArray = model.fieldArray; 
     fieldArray.push("New thing to FieldArray"); 
     var newFieldArray = fieldArray; 
     if (typeof newFieldArray === "object") model.fieldArray = newFieldArray; 
     model.save(function (err, updatedModel){ 
      if (err) throw err; 
      res.send(updatedModel); 
     }); 
    }); 
}); 

Also das Ding oben wirft "undefiniert ist keine Funktion" über die Verwendung model.save (..)

ich auch versucht, zweite Variante des Snippets (2), nennen wir es Snippet (3), einschließlich der .exec() Auch nicht funktioniert, wirft das gleiche "undefined ist keine Funktion" auf model.save (..) Also die Schnipsel (3) ist dies:

router.get('/:myId/:addThisToFieldArray', function(req, res, next) { 
    var myId = req.params.myId; 
    var addThisToFieldArray = req.params.addThisToFieldArray; 
    Model.find({myId: myId}).exec(function (err, model) { 
     if (err) throw err; 
     var fieldArray = model.fieldArray; 
     fieldArray.push("New thing to FieldArray"); 
     var newFieldArray = fieldArray; 
     if (typeof newFieldArray === "object") model.fieldArray = newFieldArray; 
     model.save(function (err, updatedModel){ 
      if (err) throw err; 
      res.send(updatedModel); 
     }); 
    }); 
}); 

Ich werde für alle ich dankbar sein Eingaben und Vorschläge!

auf den Versuch von Willson Ansering:

Ja, ich weiß, wenn ich model.find nennen (.. es gibt Array, wenn ich model.findOne nennen (.. es gibt ein Objekt json

Ich habe versucht, mein Beispiel zu vereinfachen und in meiner Version habe ich tatsächlich verwendet: "Modell [0] .FieldArray = newFieldArray", um das Ding von Array Faust (das Array selbst) und dann den neuen Wert zuweisen.

Das Problem besteht immer noch, es gibt mir auf model.save (.. "undefined ist keine Funktion")

Der aktuelle Code ist:

router.get('/:myId/:addThisToFieldArray', function(req, res, next) { 
    var myId = req.params.myId; 
    var addThisToFieldArray = req.params.addThisToFieldArray; 
    Model.find({myId: myId}).exec(function (err, model) { 
     if (err) throw err; 
     var fieldArray = model[0].fieldArray; 
     fieldArray.push("New thing to FieldArray"); 
     var newFieldArray = fieldArray; 
     if (typeof newFieldArray === "object") model[0].fieldArray = newFieldArray; 
     model.save(function (err, updatedModel){ 
      if (err) throw err; 
      res.send(updatedModel); 
     }); 
    }); 
}); 

Dieser Code-Schnipsel (4) oben auf model.save gibt (.. "undefiniert ist keine Funktion"

+1

Verwenden Sie 'findOne' anstelle von' finden' – friedi

+0

ok, ich werde versuchen, das zu tun und werde kommentieren, was ich bekam – JavaJedi

Antwort

9

Wenn Sie in Mongoose verwenden, um die find Methode, es gibt einen Array zurück, da es ein oder mehrere Dokumente entdecken kann, so in Ihrem Beispiel abfragen Sie spezifisches Element durch seine ID ein, sollten Sie das erste Element auf dem zurückgegebenen Array greifen:

 
    Model.find({myId: myId}).exec(function (err, documents) { 
      var model = documents[0]; 

      if (err) throw err; 
      var fieldArray = model[0].fieldArray; 

Hier

ist ein Beispiel:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost:27017/java-jedi'); 

var HackerSchema = new Schema({ 
    name: String, 
    languages: [String] 
}); 

var Hacker = mongoose.model('Hacker', HackerSchema); 


// instantiating the model. 
var oneHacker = new Hacker(); 
oneHacker.name = 'Richard Stallman'; 

oneHacker.save(function(err) { 
    if (err) throw err; 

    // finding the document intentionally for this example 
    Hacker.find({_id: oneHacker._id}, function(err, hackers) { 
    var hacker = hackers[0]; 

    // modifying the document and updating it. 
    hacker.languages.push('Lisp'); 
    hacker.save(function(err) { 
     if (err) throw err; 

     console.log(hacker); 
    }); 
    }); 

}); 
+0

Ja, ich bin mir dessen bewusst, wenn ich model.find (..) zurückkomme ein Array, wenn ich model.findOne (..) aufrufen gibt json Objekt, nur eine Sache. – JavaJedi

2

OK Jungs! Ich möchte Wilson Balderrama danken, weil er im Grunde auf die richtige Richtung zeigte.

Der Code funktioniert!Aber lassen Sie mich ein wenig klarstellen.

Hacker.find({_id: oneHacker._id}, function(err, hackers) { 
var hacker = hackers[0]; 

// modifying the document and updating it. 
hacker.languages.push('Lisp'); 
hacker.save(function(err) { 
    if (err) throw err; 

    console.log(hacker); 
}); 

});

Also im Grunde, da die Model.find (.. gibt einen Array
, wenn wir uns das Ding von Array greifen vor dem Speichern speichern haben

So korrigiert und letzte funktionierende Version von meinem Beispiel wird sein:.

router.get('/:myId/:addThisToFieldArray', function(req, res, next) { 
    var myId = req.params.myId; 
    var addThisToFieldArray = req.params.addThisToFieldArray; 
    Model.find({myId: myId}).exec(function (err, model) { 
     if (err) throw err; 
     var fieldArray = model[0].fieldArray; 
     fieldArray.push("New thing to FieldArray"); 
     var newFieldArray = fieldArray; 
     if (typeof newFieldArray === "object") model[0].fieldArray = newFieldArray; 
     model[0].save(function (err, updatedModel){ 
      if (err) throw err; 
      res.send(updatedModel); 
     }); 
    }); 
}); 

Oder wir können nur Model.findOne verwenden (.. zu vermeiden, uns mit diesem verwirrenden ARRY

In diesem Fall kehren wir direkt greifen:

router.get('/:myId/:addThisToFieldArray', function(req, res, next) { 
var myId = req.params.myId; 
var addThisToFieldArray = req.params.addThisToFieldArray; 
Model.findOne({myId: myId}).exec(function (err, model) { 
    if (err) throw err; 
    var fieldArray = model.fieldArray; 
    fieldArray.push("New thing to FieldArray"); 
    var newFieldArray = fieldArray; 
    if (typeof newFieldArray === "object") model.fieldArray = newFieldArray; 
    model.save(function (err, updatedModel){ 
     if (err) throw err; 
     res.send(updatedModel); 
    }); 
}); 
}); 

Also im zweiten Fall Modell [0] .save (... wird model.save (... direktes Greifen und Speichern.

Vielen Dank Wilson Balderrama wieder !!

+0

froh, dass es dir geholfen hat, kein Problem! – Wilson

Verwandte Themen