Как вставить ссылку и сохранить через POST API в NodeJs? - PullRequest
0 голосов
/ 20 сентября 2018

Использование express.js фреймворка для приложения стека MERN.Это мое первое js приложение с полным стеком, так что впервые в большинстве этих функций.Нужно POST новый пост в теме, а также обновить тему.Сообщения со ссылкой на коллекцию сообщений.

Вот server.js:

router.post('/:id/posts', (req,res) => {
  const { id } = req.params // works

  const newPost = new Post({
    post: req.body.post,
    description: req.body.description,
    topic_id: id
  })

  const topic = Topic.findById(id).then(topics => res.json(topics))

  console.log(topic.posts)
  // and I don't understand why my topic object is always undefined I need to push a reference into it I think.

  //need to save/update topic object to db
  //need to save new post
  //my other post function has newPost.save().then(post => res.json(post) and it works. but in this function it doesn't. 
});

Это схема

const TopicSchema = new Schema({
    topic: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    posts: [
        { 
            type: Schema.Types.ObjectId,
            ref: 'post'
        }
    ],
    date: {
        type: Date,
        default: Date.now
    }
});   

Если бы кто-нибудь мог провести меня через то, что яделаю не так, буду благодарен.Также выдвигается на GitHub , если требуется дополнительная информация

строка 31 - фрагмент кода.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Эта строка неверна

const topic = Topic.findById(id).then(topics => res.json(topics))

Здесь вы делаете асинхронный вызов, поэтому тема будет обещанием, а тема.посты будут неопределенными (нормальными)

Это похоже на использование TypeScriptили Ecmascript, чтобы вы могли сделать: (посмотрите на async и await ключевое слово)

router.post('/:id/posts', async (req,res) => {

  const { id } = req.params // works

   const newPost = new Post({
     post: req.body.post,
     description: req.body.description,
     topic_id: req.body.id
   })

   try {
     const topic = await Topic.findById(id);
   }catch(err){
      // send a status 404 cause the id dont match any topic
      return;
   }
   console.log(topic.posts) //undefined but i still need to add post._id to my topic.posts 

     //attempt to save newPost object
   try {
     const post = await newPost.save();
     res.json(post);
   }catch(err){
      // You can send a internal error status cause something went wrong
   }
     // returns not post json but a topic json?
     // plus error
});
0 голосов
/ 20 сентября 2018

Чтобы сохранить, сделайте следующее:

const topic = Topic.findById(id).then(topic => {
    topic.posts.push(newPost);
    topic.save(err => {
       if (err) {
         res.sendStatus(400)
       } else {
         res.sendStatus(200)
       }
    })
})

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

...