mongoose.js CastError:在路径“未定义”处为值“[object Object]”转换为数字失败
Posted
技术标签:
【中文标题】mongoose.js CastError:在路径“未定义”处为值“[object Object]”转换为数字失败【英文标题】:mongoose.js CastError: Cast to number failed for value "[object Object]" at path "undefined" 【发布时间】:2013-02-06 22:17:57 【问题描述】:将Mongoose.js
与node.js
一起使用。
我有这个架构:
var Photo = new Schema(
URL:String
,description:String
,created_by:type:ObjectId, ref:'User'
,created_at:type:Date, default:Date.now()
);
var User = new Schema(
name:type:String,index:true
,email:type:String,index:true, unique:true
);
//Task model
var Task = new Schema(
title:String
,created_by:type:ObjectId, ref: 'User'
,created:type:Date, default:Date.now()
,responses:[
type:Number
,user:type:ObjectId, ref: 'User'
,comment:String
,avatarURL:String
,photo:type:ObjectId, ref: 'Photo'
,created:type:Date, default:Date.now()
]
);
//Group model
var Group = new Schema(
name:String
,tasks:[Task]
);
并且这段代码出错(组很好,idx 处的任务很好,响应是一个空数组,用户有效,照片有效):
var typePhoto = 6;
var resp =
type: typePhoto//photo
,user: user._id
,photo: photo._id
;
group.tasks[taskIdx].responses.push(resp); //errors out here
此时我收到以下错误:
/home/admin/notitws/node_modules/mongoose/lib/utils.js:434
throw err;
^
CastError: Cast to number failed for value "[object Object]" at path "undefined"
at SchemaNumber.cast (/home/admin/notitws/node_modules/mongoose/lib/schema/number.js:127:9)
at Array.MongooseArray._cast (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:78:15)
at Object.map (native)
at Array.MongooseArray.push (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:187:23)
at exports.taskAddPhoto (/home/admin/notitws/routes/group.js:1097:35)
at Promise.exports.createPhoto (/home/admin/notitws/routes/photos.js:106:4)
at Promise.addBack (/home/admin/notitws/node_modules/mongoose/lib/promise.js:128:8)
at Promise.EventEmitter.emit (events.js:96:17)
at Promise.emit (/home/admin/notitws/node_modules/mongoose/lib/promise.js:66:38)
at Promise.complete (/home/admin/notitws/node_modules/mongoose/lib/promise.js:77:20)
关于如何解决此问题或可能导致此问题的任何想法?
PS 不知道这是否重要,但在获取组的调用中,我填充了 tasks.responses.user
和 tasks.responses.photo
和 tasks.created_by
。
【问题讨论】:
是数据库中的值导致类型转换失败。保存的值很好。奇怪的是错误发生在保存而不是查找时。 【参考方案1】:mongoose 使用“type”关键字来确定字段的类型。 Mongoose 可能认为响应的类型是 Number 而不是数组。
试试:
responses:[
type: type: Number
,user:type:ObjectId, ref: 'User'
,comment:String
,avatarURL:String
,photo:type:ObjectId, ref: 'Photo'
,created:type:Date, default:Date.now()
]
另一种选择是将您的响应对象包装到架构中:
responses: [Response]
【讨论】:
啊,当然!谢谢! ...现在是我让它不会崩溃它没有填充,但是你解决了崩溃所以再次感谢你! 您是否尝试过不带 () 括号的default: Date.now
?【参考方案2】:
我正在发布将我的投射修复为 objectId 的内容。这是我的 features 文档的 updatedBy key 的故事。我添加了一些 cmets 来向您展示有问题的区域对应于铸造问题。
进口猫鼬;
var mongoose = require('mongoose');
定义objectId;
var ObjectId = mongoose.Schema.Types.ObjectId;
在您的架构中定义类型;
var featureSchema = new Schema(
name: String,
isSystem: type: Number, min: 0, max: 1 ,
updatedBy: type:ObjectId, ref:'users', //here I defined the field!
updatedAt: type: Date, default: Date.now
);
然后通过post方法插入文档;
app.post('/features', function (req, res)
var feature;
console.log("POST: ");
console.log(req.body);
feature = new Feature(
name: req.body.name,
isSystem: req.body.isSystem,
updatedBy: req.body.updatedBy, //here I insert the objectId field
updatedAt: new Date()
);
feature.save(function (err)
if (!err)
return console.log("created");
else
return console.log(err);
);
return res.json( features: feature );
);
最后这是你的 json 字符串。您可以从 google chrome javascript 控制台或类似控制台触发它;
jQuery.post("/features",
"name": "Receipt",
"isSystem": 0,
"updatedBy": "528f3d44afcb60d90a000001"
,function (data, textStatus, jqXHR)
console.log("Post resposne:"); console.dir(data);
console.log(textStatus);
console.dir(jqXHR);
);
【讨论】:
以上是关于mongoose.js CastError:在路径“未定义”处为值“[object Object]”转换为数字失败的主要内容,如果未能解决你的问题,请参考以下文章
CastError:在路径“_id”处转换为 ObjectId 失败
Mongoose:CastError:在路径“_id”处为值“[object Object]”转换为 ObjectId 失败
CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败