MongoDB和Mongoose:无法使用.populate()

时间:2018-09-12 18:56:54

标签: mongodb mongoose

我已经在该网站上搜索了几天,以浏览与此主题相关的许多不同但相似的问题,但都没有结果。

这就是我想要发生的事情。用户登录后,他们的帖子会自动链接到用户集合。最终,我想将帖子链接到它发布到的个人资料上,但是我还没有到位。这是到目前为止我尝试过的事情。

在用户架构中:

const UserSchema = new Schema({
    posts: [{
        type: Schema.Types.ObjectId,
        ref: 'posts'
    }],
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    ...
});

module.exports = User = mongoose.model('users', UserSchema);

在发布架构中:

const PostSchema = new Schema({
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users'
    },
    text: {
        type: String,
        required: true
    },
    name: {
        type: String
    },
    ...
});

module.exports = Post = mongoose.model('posts', PostSchema);

在我的用户api中,这是我登录用户并尝试填充用户帖子的方式:

const User = require('../../models/User');

router.post('/login', (req, res) => {
    const { errors, isValid } = validateLoginInput(req.body);

    // Check Validation
    if (! isValid) {
        return res.status(400).json(errors);
    }

    const email = req.body.email;
    const password = req.body.password;

    // Find user by email
    User.findOne({ email })
        .populate('posts')
        .then(user => {
            if (! user) {
                errors.email = 'User not found';
                return res.status(400).json(errors);
            }

            // Check password
            bcrypt.compare(password, user.password).then(isMatch => {
                if (isMatch) {
                    // User Matched
                    // Create JWT Payload
                    const payload = {
                        id: user.id,
                        firstName: user.firstName,
                        lastName: user.lastName,
                        name: user.firstName + ' ' + user.lastName,
                        avatar: user.avatar,
                        posts: user.posts

                    };

                    jwt.sign(
                        payload,
                        keys.secretOrKey,
                        { expiresIn: 3600 }, (err, token) => {
                        res.json({
                            success: true,
                            token: 'Bearer ' + token,
                            payload
                        });
                    });

                } else {
                    errors.password = 'Password is incorrect';
                    return res.status(400).json(errors);
                }
            });
    });
});

在posts API中,这是提交帖子的方式:

router.post('/', passport.authenticate('jwt', { session: false }), (req, res) => {
    const { errors, isValid } = validatePostInput(req.body);

    if (! isValid) {
        // Return errors with 400 status
        return res.status(400).json(errors)
    }

    const newPost = new Post({
        text: req.body.text,
        name: req.body.name,
        avatar: req.body.avatar,
        user: req.user.id
    });

    newPost.save().then(post => res.json(post));
});

目前,我所看到的只是一个空数组,没有错误。我已经在这上面转动了几天,所以任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您忘记将新帖子的_id保存到用户模型,以便populate()可以查找要填充的帖子:

newPost.save().then(post => {
    User.update({ _id: req.user.id }, { $push: { posts: post._id }}, (err) => {
        res.json(post));
    });
});