[英]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.