在主页面上,有一个profile/5aa3cfb783622a145a86d616
的超链接指向用户的个人资料页面,其中5aa3cfb783622a145a86d616
是用户的对象ID(显示为"_id" : ObjectId("5aa3cfb783622a145a86d616")
在MongoDB中。)
当我点击链接时,页面完全加载没有任何问题。但是,终端仍然显示Cast to ObjectId failed for value "..." at path "_id" for model "User"
,即使网页已完全加载,浏览器的图标仍会显示正在加载。
我尝试寻找答案,但没有一个是针对我的问题的。
修改
在玩完代码之后,我发现问题似乎在于多个"填充"方法,我在简化问题时已经忽略了,因为我认为它没有问题。我现在包括下面的完整代码。
在用户文档中,有一个包含Post的ID的Post数组。每个帖子文档都有作者,喜欢和评论。在Comment数组中,每个注释文档都有Author的ID。所有这些都必须填充。
的NodeJS /猫鼬:
router.get("/:id", function(req, res){
User.findById(req.params.id).populate({
path: 'posts',
populate: [{
path: 'author',
},
{
path: 'likes',
},
{
path: 'comments',
populate: [{
path: 'author'
}]
}]
})
.exec(function(err, user){
console.log(user);
res.render("profile", {user: user});
});
});
用户架构
var UserSchema = new mongoose.Schema({
posts: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Post"
}
]
});
发布架构
var postSchema = mongoose.Schema({
author: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
likes: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
],
comments: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}
]
});
评论模式
var commentSchema = mongoose.Schema({
author: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
});
当我console.log(user)
时,终端返回以下内容。我不太清楚为什么它显示author[object]
而不是实际的ID,也许这就是问题?
{ posts:
[ { likes: [],
comments: [],
_id: 5aa3d0d806711d1483ae7e3e,
__v: 0,
author: [Object] },
{ likes: [],
comments: [],
_id: 5aa3cfc483622a145a86d618,
__v: 0,
author: [Object] },
{ likes: [],
comments: [],
_id: 5aa3cfbe83622a145a86d617,
__v: 0,
author: [Object] } ],
__v: 3}
编辑2
奇怪的是,我的其他路线具有相同的结构(除了friendPosts
之外)没有任何问题。
router.get("/home", function(req, res){
User
.findById(req.user._id)
.populate({
path: 'friendPosts',
populate: [{
path: 'author',
},
{
path: 'likes',
},
{
path: 'comments',
populate: [{
path: 'author'
}]
}]
})
.exec(function(err, currentUser){
res.render("main/home", {user: currentUser});
});
});
答案 0 :(得分:0)
你需要试试这个:
const { ObjectId } = require('mongoose').Types;
router.get("/:id", function(req, res) {
const { id } = req.params;
User.findOne({ id: ObjectId(id)}).populate({
path: 'posts',
populate: [{
path: 'author',
},
{
path: 'likes',
},
{
path: 'comments',
populate: [{
path: 'author'
}]
}
]
}).exec(function(err, user) {
console.log(user);
res.render("profile");
});
});