Nodejs Mongoose 未定义的保存模型不是函数
Nodejs Mongoose Saving model undefined is not a function
我使用 Nodejs Express 路由和 Mongoose 来保存数据。
我毫无问题地完成了核心路由 CRUD 操作。但是,当我尝试在模型的一个字段上执行一些操作,然后尝试使用 model.save 保存模型时,它说 .save() 方法:"undefined is not a function"
所以,这是代码。
片段编号 (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 is not 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);
});
});
});
所以上面的东西在使用 model.save(.. )
时抛出 "undefined is not a function"
我还尝试了代码段 (2) 的第二个变体,我们称它为代码段 (3),包含 .exec() 也不起作用,在 [=47= 上抛出相同的 "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);
});
});
});
如有任何意见和建议,我将不胜感激!
回应 Willson 的尝试:
是的,我知道当我调用 model.find(.. 它给出数组,如果我调用 model.findOne(.. 它给出一个对象 json
我试图简化我的例子,在我的版本中我确实使用了:
"model[0].fieldArray = newFieldArray" 从数组拳头(数组本身)中获取东西,然后分配给新值。
问题仍然存在,它给了我 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);
});
});
});
上面的代码片段 (4) 给出了 model.save(.. "undefined is not a function"
当您在 Mongoose 中使用 find
方法时,它将 return 一个数组,因为它可以发现一个或多个文档,因此在您的示例中,您通过其 id 查询一个特定元素,您应该获取 returned 数组中的第一个元素:
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(.. return 是一个数组
当我们保存时,我们必须在保存之前从数组中获取东西。
我的示例的更正和最终工作版本将是:
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(.. 来避免混淆这个数组 return
本例我们直接抓取:
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(...直接抓取保存。
再次感谢 Wilson Balderrama!!
我使用 Nodejs Express 路由和 Mongoose 来保存数据。 我毫无问题地完成了核心路由 CRUD 操作。但是,当我尝试在模型的一个字段上执行一些操作,然后尝试使用 model.save 保存模型时,它说 .save() 方法:"undefined is not a function"
所以,这是代码。 片段编号 (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 is not 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);
});
});
});
所以上面的东西在使用 model.save(.. )
时抛出 "undefined is not a function"我还尝试了代码段 (2) 的第二个变体,我们称它为代码段 (3),包含 .exec() 也不起作用,在 [=47= 上抛出相同的 "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);
});
});
});
如有任何意见和建议,我将不胜感激!
回应 Willson 的尝试:
是的,我知道当我调用 model.find(.. 它给出数组,如果我调用 model.findOne(.. 它给出一个对象 json
我试图简化我的例子,在我的版本中我确实使用了: "model[0].fieldArray = newFieldArray" 从数组拳头(数组本身)中获取东西,然后分配给新值。
问题仍然存在,它给了我 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);
});
});
});
上面的代码片段 (4) 给出了 model.save(.. "undefined is not a function"
当您在 Mongoose 中使用 find
方法时,它将 return 一个数组,因为它可以发现一个或多个文档,因此在您的示例中,您通过其 id 查询一个特定元素,您应该获取 returned 数组中的第一个元素:
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(.. return 是一个数组
当我们保存时,我们必须在保存之前从数组中获取东西。
我的示例的更正和最终工作版本将是:
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(.. 来避免混淆这个数组 return
本例我们直接抓取:
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(...直接抓取保存。
再次感谢 Wilson Balderrama!!