猫鼬填充可按用户获取所有帖子,返回空数组

时间:2019-07-21 19:05:23

标签: javascript mongodb express mongoose

我试图更好地了解Express.js,并试图创建一个简单的博客网站。

我的用户模型很简单:用户名,显示名和帖子数组。

const userSchema = new Schema({
    username: {
        type: String,
        required: true, 
        unique: true, 
        trim: true, 
        minlength: 3
    },
    displayname: {
        type: String,
        required: true,
        minlength: 1
    },
    posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }]
}, {
    timestamps: true,
});

我的Post模型也是如此:内容和作者。

const postSchema = new Schema({
    body: {
        type: String,
        required: true,
        minlength: 1,
        maxlength: 140
    },
    author: { type: Schema.Types.ObjectId, ref: 'User', required: true }
});

我已经成功创建了一个新用户并发布:

[
  {
    "posts": [],
    "_id": "5d32c9474e28f66c08119198",
    "username": "Prince",
    "displayname": "The Artist",
    "createdAt": "2019-07-20T07:56:55.405Z",
    "updatedAt": "2019-07-20T07:56:55.405Z",
    "__v": 0
  }
]

[
  {
    "_id": "5d34af1ecae7e41a40b46b5a",
    "body": "This is my first post.",
    "author": "5d32c9474e28f66c08119198",
    "__v": 0
  }
]

这是我创建用户并发布帖子的路线

//Create a user
router.route('/create').post((req, res) => {
    const username = req.body.username;
    const displayname = req.body.displayname;

    const newUser = new User({
        username, 
        displayname
    });

    newUser.save()
        .then(() => res.json('New user created!'))
        .catch(err => res.status(400).json(`Error: ${err}`));
});
//Create A Post
router.route('/create').post((req, res) => {
    const body = req.body.body;
    const author = req.body.author;
    const newPost = new Post({
        body,
        author
    });

    newPost.save()
        .then(() => res.json('Created new post!'))
        .catch(err => res.status(400).json(`Error: ${err}`));
});

还有我获取用户所有帖子的方法:

//Get all posts by user
router.route('/posts/:id').get((req, res) => {
    User.findById(req.params.id)
        .populate('posts')
        .exec((err, user) => {
            if(err) {
                res.status(400).json(`Error: ${err}`);
            } else {
                res.json(user.posts);
            }
        });
});

每当我查看/ users / posts /:id的响应时,该数组为空,但是我希望它被用户提供的ID所填充的帖子所填充吗?我是否误解了人口的工作方式?

1 个答案:

答案 0 :(得分:1)

您需要将帖子ID添加到用户帖子列表中,以使猫鼬的填充正常工作。

router.post('/create' async (req, res) => {
    const body = req.body.body;
    const author = req.body.author;
    const newPost = new Post({
        body,
        author
    });
    try {
        const user = await User.findById(author);
        const post = await newPost.save()
        user.posts = user.posts.concat(post._id)
        await user.save()
        return res.json(post.toJSON())
    } catch (e) {
        return res.status(400).json(`Error: ${e}`));
    }
});