MongoDB и Mongoose: невозможно заполнить сообщения пользователя с помощью .populate () - PullRequest
0 голосов
/ 12 сентября 2018

Я искал этот сайт несколько дней, просматривая множество разных, но похожих вопросов по этой теме, но безрезультатно.

Вот что я хотел бы случиться. Пользователь входит в систему, и его сообщения автоматически связываются с коллекцией пользователей. В конце концов я хотел бы связать посты с профилем, в котором он был опубликован, но я еще не совсем там. Вот что я пробовал до сих пор.

В пользовательской схеме:

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);
                }
            });
    });
});

В сообщениях 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 голосов
/ 12 сентября 2018

Я думаю, что вы забыли сохранить _id вашего нового сообщения в модели пользователя, чтобы populate() мог искать сообщения для заполнения:

newPost.save().then(post => {
    User.update({ _id: req.user.id }, { $push: { posts: post._id }}, (err) => {
        res.json(post));
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...