NodeJS / Mongoose:转换为ObjectId失败的值" ..."在路径" _id"

时间:2018-03-11 04:28:03

标签: node.js mongodb mongoose

在主页面上,有一个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}); 
    });
});

1 个答案:

答案 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");
    });

});