Как использовать заполнение с обратными вызовами? - PullRequest
1 голос
/ 09 марта 2020

User model

const Schema = mongoose.Schema

const userSchema = new Schema({
    username: { type: String, required: true },
    email: { type: String, reuired: true },
    password: { type: String, required: true },
    posts:[{ type: Schema.Types.ObjectId, ref: "Posts" }]
}, { timestamps: true })

Post model

const Schema = mongoose.Schema;

const postSchema = new Schema({
  title: { type: String, required: true },
  content: { type: String, required: true },
  user: { type: Schema.Types.ObjectId, ref: "User" },
}, { timestamps: true }

endpoint for getting all posts with all users information

    listPostsWithUsers: (req, res, next) => {
        Post.find({}, (error, posts) => {
            if (error) {
                return res.status(500).json({ error: "something went wrong" })
            } else if (!posts) {
                return res.status(400).json({ msg: "sorry no posts" })
            } else if (posts) {
                return res.status(200).json({ posts })
            }
        })
    }

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

Теперь мой вопрос: как мне применить * 1022? * метод в вышеуказанной конечной точке. В основном все примеры с функцией exec(), но я не видел ни одного примера с обратными вызовами. Это своего рода синтаксическая проблема.

Спасибо.

Update#1: результат, который я получаю в настоящее время.

{
    "posts": [
        {
            "_id": "5e65cce5ebddec0c5cc925ab",
            "title": "Neil's Post",
            "content": "post by neil.",
            "createdAt": "2020-03-09T04:58:13.900Z",
            "updatedAt": "2020-03-09T04:58:13.900Z",
            "__v": 0
        },
        {
            "_id": "5e65cd32ebddec0c5cc925ad",
            "title": "Slash's post",
            "content": "post by slash.",
            "createdAt": "2020-03-09T04:59:30.180Z",
            "updatedAt": "2020-03-09T04:59:30.180Z",
            "__v": 0
        },
        {
            "_id": "5e65f430a989612916636e8d",
            "title": "Jimmy's post",
            "content": "post by jimmy",
            "createdAt": "2020-03-09T07:45:52.664Z",
            "updatedAt": "2020-03-09T07:45:52.664Z",
            "__v": 0
        }
    ]
}

Update#2

users коллекция.

{
    "users": [
    {
        "posts": [],
        "_id": "5e65ccbeebddec0c5cc925aa",
        "username": "Neil",
        "email": "neily888@gmail.com",
        "password": "$2b$10$AHHRKuCX3nakMs8hdVj0DuwD5uL0/TJwkJyKZYR/TXPTrIo9f80IW",
        "createdAt": "2020-03-09T04:57:35.008Z",
        "updatedAt": "2020-03-09T04:57:35.008Z",
        "__v": 0
    },
    {
        "posts": [],
        "_id": "5e65cd0eebddec0c5cc925ac",
        "username": "Slash",
        "email": "slash938@gmail.com",
        "password": "$2b$10$QQX/CFJjmpGdBAEogQ4XO.1e1ZowuPCX7pJcHTUav7NfatGgp6sa6",
        "createdAt": "2020-03-09T04:58:54.520Z",
        "updatedAt": "2020-03-09T04:58:54.520Z",
        "__v": 0
    },
    {
        "posts": [],
        "_id": "5e65f408a989612916636e8c",
        "username": "Jimmy",
        "email": "jimmy787@gmail.com",
        "password": "$2b$10$/DjwWYIlNswgmYt3vo7hJeNupfBdFGe7p77uisYUViKv8IdhasDC.",
        "createdAt": "2020-03-09T07:45:12.293Z",
        "updatedAt": "2020-03-09T07:45:12.293Z",
        "__v": 0
    }
    ]
}

Update#3:

usersController

const User = require("../models/User")

module.exports = {

  createUser: (req, res) => {
    User.create(req.body, (err, createdUser) => {
      if (err) console.log(err)
      res.json({createdUser})
    })
  },


  listUsers: (res) => {
    User.find({}, (err, users) => {
      if (err) console.log(err)
      res.json({users})
    })
  },

  getUser: (req, res) => {
    User.findById(req.params.id, (err, user) => {
      if (err) console.log(err)
        return res.json({user})
    })
  },

  updateUser: (req, res) => {

    const user = {
      username: req.body.username,
      email: req.body.email,
      password: req.body.password
    }

    User.findOneAndUpdate(req.params.id, user, { new: true }, (err, updatedUser) => {
        if (err) console.log(err)
        res.json({updatedUser})
    })
  },

  deleteUser: (req, res) => {
    User.findByIdAndDelete(req.params.id, (err, deleteduser) => {
      if (err) console.log(err)
        return res.status(200).json({ user: deleteduser })
    })
  }
}

postsController

const Post = require("../models/Post")

module.exports = {

  createPost: (req, res) => {

    const data = {
      title: req.body.title,
      description: req.body.description,
    }

    Post.create(data, (err, newPost) => {
      if (err) console.log(err);
        return res.status(200).json({ newPost })
    })
  },


  listPosts: (res) => {
    Post.find({}, async (err, posts) => {
      if (err) console.log(err);
        posts = await Post.populate(posts, {
          path: "user",
          model: "User"
        })
        return res.status(200).json({ posts })
    })
  },

  findPost: (req, res) => {
    Post.findById(req.params.id, (err, post) => {
      if (err) console.log(err);
        return res.json({ post })
      }
    )
  },

  updatePost: (req, res) => {

    const post = {
      title: req.body.title,
      description: req.body.description
    }

    Post.findByIdAndUpdate(req.params.id, post, { new: true },(err, updatedPost) => {
      if (err) console.log(err);
          return res.status(200).json({ updatedPost })
    })
  },

  deletePost: (req, res) => {
    Post.findByIdAndDelete(req.params.id, (err, deletedPost) => {
      if (err) console.log(err);
        return res.status(200).json({ deletedPost })
    })
  }
}

Update#4

router.get("/posts/:id", usersController.getUserPosts) `

    getUserPosts: (req, res) => {
        User.findById(req.params.id, async (err, user) => {
            if (err) {
                return res.status(500).json({ error: "Server error" })
            } else if (!user) {
                return res.status(400).json({ error: "No user" })
            } else if (user) {
                user = await User.populate("user", {
                  path: "posts",
                  model: "Post"
              })
            return res.status(200).json({ user })
         }
      })
    }

Ответы [ 2 ]

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

Я предлагаю вам использовать пн goose заполнить.

listPostsWithUsers : (req, res, next) => {
Post.find({}).populate('user').exec(function (err, data) {
 if (err) {
   console.log(err);
 } else {
     console.log(data);
   }
 })
}

Вы можете сослаться на этот официальный пн goose заполнить документ

Вы можете даже заполнить столько полей, которые необходимо заполнить с помощью заполнения, как

populate([{ path: 'user' }, { path: 'book', select: { author: 1 } }])

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

Редактировать 1

  createPost: (req, res) => {

const data = {
  title: req.body.title,
  description: req.body.description,
  user: req.user._id,
}

Post.create(data, (err, newPost) => {
  if (err) console.log(err);
    return res.status(200).json({ newPost })
})

Вам нужно будет добавить пользовательское поле в пост при создании. Возьмите идентификатор пользователя из токена или из запроса, и вам будет полезно go.

Изменить 2

getUserPosts: (req, res) => {
    User.findById(req.params.id).populate([{ path: 'posts' }])
     .exec(function (err, data) {
       if (err) {
        console.log(err);
       } else {
          console.log(data);
        }
    });
}

Вы находите данные в пользовательском модуле и хотите заполнить данные поста, так что вам просто нужно указать, какое поле вы хотите заполнить, как вы уже определили для поля, какую модель ссылаться, добавив ссылку с этим полем в схему mon goose.

getUserPosts: (req, res) => {
    User.findById(req.params.id, async (err, user) => {
        if (err) {
            return res.status(500).json({ error: "Server error" })
        } else if (!user) {
            return res.status(400).json({ error: "No user" })
        } else if (user) {
            user = await User.populate("posts")
        return res.status(200).json({ user })
     }
  })
}

Это также должно работать для вы.

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

Вы можете сделать это после получения сообщений как:

  listPostsWithUsers: (req, res, next) => {
        Post.find({}, async (error, posts) => {
            if (error) {
                return res.status(500).json({ error: "something went wrong" })
            } else if (!posts) {
                return res.status(400).json({ msg: "sorry no posts" })
            } else if (posts) {
                posts = await Post.populate(posts, {
                  path: 'user',
                  model: 'User'
                });
                return res.status(200).json({ posts })
            }
        })
    }
...