簡體   English   中英

Nodejs Mongoose Saving model undefined不是一個函數

[英]Nodejs Mongoose Saving model undefined is not a function

我使用Nodejs Express路由和Mongoose來保存數據。 我做了核心路線CRUD操作沒有問題。 但是,當我嘗試在Model的某個字段上執行某些操作然后嘗試使用model.save保存Model時,它說的是.save()方法:“undefined不是函數”

所以,這是代碼。 片段編號(1)工作得很好:

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

});

所以模型有6個字段:fieldA,.. B,.. C,.. D,myId標識為索引,一個字段是一些值的數組fieldArray。 上面的例子保存了Model,工作正常。 但是,如果我現在嘗試使用數組字段fieldArray做一些事情,然后保存模型,當我使用model.save()時,它會拋出“undefined is is a function”。 所以代碼段(2)是產生此錯誤的代碼:

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

所以上面的東西拋出“undefined不是函數”使用model.save(..)

我也嘗試了片段的第二個變體(2),讓我們稱它為片段(3),並入.exec()也不起作用,在model.save(...)上拋出相同的“undefined is not a function”所以代碼片段(3)是這樣的:

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

我會很高興任何意見和建議!

對威爾森的嘗試進行了回顧:

是的,我知道當我調用model.find(..它給出數組,如果我調用model.findOne(..它給出一個對象json)

我試圖簡化我的例子,在我的版本中我實際上使用了:“model [0] .fieldArray = newFieldArray”從Array拳頭(數組本身)獲取東西,然后分配給新值。

問題仍然存在,它給了我model.save(..“undefined不是一個函數”)

目前的代碼是:

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

上面的代碼片段(4)給出了model.save(..“undefined不是函數”

當您在Mongoose中使用find方法時,它將返回一個數組,因為它可以發現一個或多個文檔,因此在您的示例中,您通過其id查詢一個特定元素,您應該獲取返回數組上的第一個元素:

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

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

這是一個例子:

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

});

好,朋友們! 我要感謝Wilson Balderrama,因為他基本上指出了正確的方向。

代碼有效! 但讓我澄清一下。

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

});

所以基本上是因為Model.find(..返回一個數組
當我們保存時,我們必須在保存之前從數組中獲取東西。

我的示例的更正和最終工作版本將是:

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

或者我們可以只使用Model.findOne(...以避免混淆我們自己的回報

在這種情況下,我們直接抓住:

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

所以在第二種情況下模型[0] .save(...變成model.save(......直接抓取並保存)。

再次感謝Wilson Balderrama !!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM