Создайте почтовый маршрут, который добавляет ссылки на его отношения - PullRequest
0 голосов
/ 20 сентября 2018

У меня работает базовое приложение MERN Stack, которое я могу, GET, POST и Delete Topics и Post отдельно, они связаны в Schema, но я не понимаю, как правильно его маршрутизировать, чтобы включить отношения при POSTing.

const express = require('express');
const router = express.Router();

 const Post = require("../../models/Post");
 const Topic = require('../../models/Topic');

router.post("/", (req,res) => {
  //gets topic id from param
const {topic} = req.params;
  //creating a new post
const newPost = new Post({
    post: req.body.post,
    description: req.body.description,
    topic_id: req.body.topic_id
});
  //get topic by id
const topic_obj = Topic.findById(topic);
  //add posts to topic_object 
topic_obj.posts.push(newPost);
  //and save
topic_obj.save()
    .then(newPost.save()
    .then(post => res.json(post)).catch(err => console.log(err)));
});
module.exports = router;

Не знаю, нужна ли вам дополнительная информация, я отправил ее на GitHub для получения справки. L https://github.com/wolffles/bloccit-node/blob/react/routes/api/posts.js

1 Ответ

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

По TopicSchema:

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

Чтобы включить связь между Topic и Post, необходимо добавить свойство _id вновь созданного объекта Post в поле posts вTopic объект, который представляет этот недавно созданный Post.

topic_obj.posts.push(newPost._id);

РЕДАКТИРОВАТЬ: В вашем коде есть некоторые проблемы, которые вызывают ошибки.

  1. const {topic} = req.params; Вы должны проверить, является ли topic действительным ObjectId
  2. Вам также следует проверить тело запроса и проверить, имеет ли description и post требуемый формат.
  3. Youдублируйте Topic id, передав его в теле запроса, а также в качестве параметра запроса.
  4. const topic_obj = Topic.findById(topic); Это операция async , она возвращает Promise, а не результат запроса.

Код должен выглядеть следующим образом ( он не проверен ):

const express = require("express");
const router = express.Router();

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

router.post("/:topicId", async (req, res) => {
 const { topicId } = req.params;

 //TODO: validate if topic is a valid ObjectID
  const validTopicId = validateTopicId(topicId);
  if (!validTopicId) return res.status(400).send("Invalid param.");

   //TODO: validate req.body.description and req.body.post
   const validBody = validateBody(req.body);
   if (!validBody) return res.status(400).send("Invalid data.");

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

 const topic = await Topic.findById(topicId);
 if (!topic) return res.status(400).send("Invalid param.");

 topic.posts.push(newPost._id);

 await topic.save();
 await newPost.save();

 res.send();
});

module.exports = router;
...