Nodejs Mongoose保存模型undefined不是一个函数

我使用Nodejs Express路由和Mongoose来保存数据。 我做了核心路线CRUD操作没有问题。 但是,当我尝试在模型的某个字段上执行某些操作,然后尝试使用model.save保存模型时,它会提到.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的数组。 上面的例子保存模型,工作正常。 但是,如果我现在尝试使用数组字段fieldArray做一些事情,然后保存模型,当我使用model.save()时,它会抛出“undefined不是一个函数”。 所以片段(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); }); }); }); 

所以上面的东西在使用model.save(..)时抛出“undefined不是函数”

我也试过片段(2)的第二个变体,我们称之为片段(3),并入.exec()也不起作用,抛出相同的“undefined不是一个函数”上model.save(..)所以片段(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); }); }); }); 

我会很乐意提供任何意见和build议!

对于威尔逊的企图:

是的,我知道当我打电话给model.find(..它给数组,如果我打电话给model.findOne(..它给一个对象JSON

我试图简化我的例子,在我的版本中,我实际上使用:“model [0] .fieldArray = newFieldArray”从Array fist(数组本身)获取事物,然后分配给新的值。

问题仍然存在,它给了我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];

            如果(犯错)抛出犯错;
             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); }); }); }); 

所以在第二种情况下model [0] .save(…变成model.save(…直接抓取和保存。

再次感谢威尔逊Balderrama!