在关注mongoose教程时,名为followers
的架构字段的类型为ObjectId
的数组:
followers:[Schema.Types.ObjectId]
我使用postman提交新文档,POST数据具有JSON格式:
{
"title":"test title999",
"text":"test text999b",
"meta":[1, [], 'three', { four: 5 }],
"followers":["582ff61afe100611809e7fa5"]
}
应用程序的快速POST路由有一个验证方法,除了上面提到的一个,我没有遇到任何问题,因为我收到了这个错误:
{
"message": "Post validation failed",
"name": "ValidationError",
"errors ":{
"followers ":
{"message ":"Cast to ObjectID failed for value\ "[ '\"577f9cecd71d71fa1fb6f43a\ "' ]\" at path \"followers\"",
"name": "CastError",
"kind": "ObjectID ",
"value ":["\"577f9cecd71d71fa1fb6f43a\""],
"path": "followers",
"reason": {
"message ":"Cast to ObjectId failed for value\ "[ '\"577f9cecd71d71fa1fb6f43a\"' ]\" at path\ "followers\"",
"name": "CastError",
"kind": "ObjectId",
"value": ["\"577f9cecd71d71fa1fb6f43a\ ""],
"path": "followers"
}
}
}
}
----编辑-----
POST路由中的validate方法:
app.post('/posts', function(req, res, next) {
var post = new Post(req.body);
post.validate(function(error){
console.log("\n\n validate error : " + JSON.stringify(error) + "\n\n");
if(error) return next(error);
post.save(function(error, result){
console.log("\n\n save error : " + JSON.stringify(error) + "\n\n");
if(error) return next(error);
res.send(result);
});
});
});
和模型:
var postSchema = new Schema({
title:{
type:String,
required:true,
trim:true,
match:/^([\w ,.!?]{1,100})$/
},
text:{
type:String,
required:true,
max:2000
},
followers:[Schema.Types.ObjectId],
meta:Schema.Types.Mixed,
viewCounter:Number,
published:Boolean,
createdAt:{
type:Date,
default:Date.now,
required:true
},
updatedAt:{
type:Date,
default:Date.now,
required:true
}
});
答案 0 :(得分:0)
您需要在followers
模型中附加对post
属性的引用,假设其他模型名为user
,所以它将如下所示:
followers: {type: Schema.Types.ObjectId, ref: 'User'}
详细了解here中的mongoose引用。
答案 1 :(得分:0)
在阅读了一些在猫鼬中使用嵌入式文档的例子之后(作为this one)我找到了解决方案:
followers
字段值在String
对象中显示为body.req
,无法自动转换为ObjectId
。解析它:
req.body.followers = JSON.parse(followers);
可以将其保存在其他字段中。 POST路线变成这样:
app.post('/posts', function(req, res, next) {
req.body.followers = JSON.parse(req.body.followers);
var post = new Post(req.body);
post.validate(function(error){
console.log("\n\n validate error : " + JSON.stringify(error) + "\n\n");
if(error) return next(error);
post.save(function(error, result){
console.log("\n\n save error : " + JSON.stringify(error) + "\n\n");
if(error) return next(error);
res.send(result);
});
});
});
因此,POST请求不能100%动态,并且必须在保存过程之前完成某些特定的转换。至于Basim Hennawi,不需要将ref字段添加到schema的字段中。