Как сохранить пользовательский документ при создании нового поста? - PullRequest
0 голосов
/ 21 марта 2020

Итак, я разобрался с предыдущими проблемами и мне просто нужно заполнить пользовательский документ постами. В настоящее время пользовательский документ выглядит следующим образом:


        {
            "posts": [],
            "_id": "5e75cf827ef14514f69c6714",
            "username": "dio",
            "email": "dio123@gmail.com",
            "password": "$2b$10$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO",
            "createdAt": "2020-03-21T08:25:38.459Z",
            "updatedAt": "2020-03-21T08:25:38.459Z",
            "__v": 0
        }

Итак, я сделал это при создании сообщения, чтобы иметь возможность заполнить его позже.

newPost: (req, res) => {

    const data = {
        title: req.body.title,
        content: req.body.content,
        user: req.user.userId
    }

    Post.create(data, (err, newPost) => {
        console.log(data, "data")
        if (err) {
            return res.status(500).json({ error: err })
        } else if (!newPost) {
            return res.status(400).json({ message: "No Post found" })
        } else if (newPost) {
            User.findById(req.user.userId, (err, user) => {
                user.Posts = user.Posts.concat(newPost._id)
                return res.status(200).json({ newPost, user })
            })
        }
    })
}

После этого, когда я возвращаю пользователя из Приведенный выше оператор возврата выглядит следующим образом:

{ 
    posts: [ 5e75d89fa048e321f704453b ],
    _id: 5e75cf827ef14514f69c6714,
    username: 'dio',
    email: 'dio123@gmail.com',
    password: '$2b$10$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO',
    createdAt: 2020-03-21T08:25:38.459Z,
    updatedAt: 2020-03-21T08:25:38.459Z,
    __v: 0
 }

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

Кроме того, я хочу получать сообщения пользователя:

        getUserPosts: async (req, res) => {
            try {
              const user = await User.findById(req.params.id).populate("posts");

              if (!user) {
                return res.status(400).json({ error: "No user" });  
              }

              return res.status(200).json({ userPosts: user.posts });
            } catch (err) {
              return res.status(500).json({ error: "Server error" });
            }
        }

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

Ответы [ 2 ]

1 голос
/ 21 марта 2020

После добавления идентификатора нового сообщения в массив сообщений пользователя необходимо сохранить пользователя:

  Post.create(data, (err, newPost) => {
    console.log(data, "data");
    if (err) {
      return res.status(500).json({ error: err });
    } else if (!newPost) {
      return res.status(400).json({ message: "No Post found" });
    } else if (newPost) {
      User.findById(req.user.userId, (err, user) => {
        user.posts.push(newPost._id);
        user
          .save()
          .then(() => {
            return res.status(200).json({ newPost, user });
          })
          .catch(err => {
            return res.status(500).json({ error: err });
            console.log(err);
          });
      });
    }
  });

Как я помню в ваших предыдущих вопросах, имя поля для сообщений было posts не Posts в пользовательской схеме, поэтому важна следующая строка, также мы используем метод pu sh вместо concat:

user.posts.push(newPost._id);

После этого нам просто нужно сохранить пользователя с помощью save метод, так как метод save возвращает обещание, которое я добавил, затем ловит блоки.

0 голосов
/ 21 марта 2020

SuleymanSah ответ правильный. Однако помните о более безопасной версии:

User.update(
    { _id: req.user.userId }, 
    { $push: { userPosts: newPost._id } },
    done
);

Причина этого заключается в том, что у пользователя может произойти изменение между поиском и сохранением, тогда как $push является операцией atomi c.

...