【发布时间】:2015-09-29 05:40:42
【问题描述】:
我使用 Nodejs Express 路由和 Mongoose 来持久化数据。 我没有问题地完成了核心路由 CRUD 操作。但是,当我尝试对模型的一个字段执行一些操作,然后尝试使用 model.save 保存模型时,它会说 .save() 方法:“未定义不是函数”
所以,这里是代码。 sn-p 数字 (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() 时抛出“未定义不是函数”。 所以sn-p(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 is not a function”
我还尝试了 sn-p (2) 的第二个变体,我们称之为 sn-p (3),合并 .exec() 也不起作用,抛出相同的“未定义不是函数”模型.保存(..) 所以sn-p(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 is not a function" )
目前的代码是:
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);
});
});
});
上面这个sn-p(4)给出了model.save(.."undefined is not a function"
【问题讨论】:
-
使用
findOne而不是find -
好的,我会尝试这样做并评论我得到的内容
标签: javascript node.js mongoose save undefined