По 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);
РЕДАКТИРОВАТЬ: В вашем коде есть некоторые проблемы, которые вызывают ошибки.
const {topic} = req.params;
Вы должны проверить, является ли topic
действительным ObjectId
- Вам также следует проверить тело запроса и проверить, имеет ли
description
и post
требуемый формат. - Youдублируйте
Topic
id, передав его в теле запроса, а также в качестве параметра запроса. 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;