2015-07-10 14 views
5

Io lavoro con route Nodejs Express e Mongoose per mantenere i dati. Ho eseguito il core delle operazioni CRUD senza alcun problema. Tuttavia, quando provo a eseguire alcune operazioni su uno dei campi del modello e poi provo a salvare il modello con model.save dice del metodo .save(): "undefined non è una funzione"Nodejs Mongoose Il salvataggio del modello non definito non è una funzione

Quindi, ecco il codice Il numero di frammento (1) funziona bene:

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); 
    }); 
}); 

});

Quindi il Modello ha 6 campi: campoA, .. B, .. C, .. D, myId per identificare come indice e un campo è Array di alcuni valori fieldArray. L'esempio sopra salva il modello, funziona bene. Tuttavia, se ora provo a fare qualcosa con fieldArray field array e poi salvo il Model, mi lancia "undefined non è una funzione" quando uso model.save(). Così il frammento (2) è il codice che produce questo errore:

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); 
     }); 
    }); 
}); 

Così che cosa sopra getta "indefinito non è una funzione" sull'uso model.save (..)

Ho anche provato seconda variante dello snippet (2), chiamiamola snippet (3), incorporando il .exec() Inoltre non funziona, lancia lo stesso "indefinito non è una funzione" su model.save (..) Quindi il snippet (3) is this:

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); 
     }); 
    }); 
}); 

Sarò grato per qualsiasi io nput e suggerimenti!

Ansering al tentativo di Willson:

Sì, lo so quando chiamo model.find (.. dà array, se chiamo model.findOne (.. dà un oggetto JSON

Ho provato a semplificare il mio esempio e nella mia versione ho effettivamente utilizzato il modello: " " model [0] .fieldArray = newFieldArray "per ottenere la cosa dal pugno dell'array (la matrice stessa) e quindi assegnare al nuovo valore.

Il problema persiste ancora, mi dà su model.save (.. "indefinito non è una funzione")

Il codice attuale è:

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); 
     }); 
    }); 
}); 

Questo frammento (4) di cui sopra dà sulla model.save (.. "indefinito non è una funzione"

+1

usa 'findOne' invece di' find' – friedi

+0

ok, proverò a farlo e commenterò cosa ho ottenuto – JavaJedi

risposta

9

Quando si utilizza nel Mongoose il metodo find, si restituirà una matrice in quanto potrebbe scoprire uno o più documenti, così nel tuo esempio si sta eseguendo la query ad uno specifico elemento dal suo ID, si dovrebbe prendere il primo elemento sulla matrice restituita:

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

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

Ecco un esempio:

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

Sì, ne sono a conoscenza, se chiamo model.find (..) restituisce un array, se chiamo model.findOne (..) restituisce json object, solo una cosa. – JavaJedi

2

OK ragazzi! Voglio ringraziare Wilson Balderrama, perché ha fondamentalmente indicato la giusta direzione.

Il codice funziona!Ma lasciatemi un po 'di clearify.

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); 
}); 

});

Quindi, in pratica dal momento che il Model.find (.. restituisce un array
quando abbiamo risparmiare dobbiamo prendere la cosa da matrice prima di salvare

Così corretto e la versione finale di lavoro di mio esempio sarà:.

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); 
     }); 
    }); 
}); 

Oppure possiamo usare solo Model.findOne (.. per evitare di confondere noi stessi con questo Arry tornare

In questo caso abbiamo afferrare direttamente:

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); 
    }); 
}); 
}); 

Quindi nel secondo caso il modello [0] .save (... diventa model.save (... direct grabbing e saving.

Grazie ancora Wilson Balderrama !!

+0

contento che ti abbia aiutato, nessun problema! – Wilson

Problemi correlati