Я пытаюсь создать блог, который использует Node.js в качестве серверного языка, с пн go БД.
Так что в моем блоге люди могут писать посты и добавлять комментарии к постам так же, как другие блоги.
Каждый пост будет иметь комментарии, вот что я пытаюсь использовать со своей схемой постов. Когда кто-то пытается написать комментарий к сообщению, он отправит POST-запрос на сервер, создаст новый комментарий и сохранит его в базе данных.
Сам комментарий корректно сохраняется во время тестирования, но я У меня проблемы с подключением к схеме сообщений.
Вот моя postSchema. js:
const mongoose = require("mongoose");
const postSchema = new mongoose.Schema(
{
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true
},
title: {
type: String,
required: true
},
body: {
type: String,
required: true
},
comments: [
{
comment: {
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}
}
]
}
);
И мой комментарийSchema. js:
const mongoose = require("mongoose");
const commentSchema = new mongoose.Schema(
{
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true
},
post: {
type: mongoose.Schema.Types.ObjectId,
ref: "Post",
required: true
},
content: {
type: String,
required: true
}
}
);
module.exports = Comment = mongoose.model("Comment", commentSchema);
Таким образом, в схеме сообщений есть массив комментариев для хранения комментариев. И каждый раз, когда пользователь добавляет комментарий, он создает запрос POST:
router.post("/:id/new_comment", async (req, res) => {
const { content } = req.body;
const comment = new Comment({
content,
owner: req.user._id,
post: req.params.id
});
try {
const post = await Post.findOne({ _id: req.params.id });
await comment.save();
await post.addComment(comment);
res.status(201).send({ post, comment });
} catch (error) {
res.status(500).send({ error: error.message });
}
});
Таким образом, этот запрос POST будет искать сообщение для добавления комментария, сохранять комментарий и вызывать addComment () для объединения комментарий в массив комментариев поста. Созданный здесь комментарий будет использоваться в качестве параметра для функции addComment ().
И функция addComment () находится внутри файла PostSchema. js и имеет вид:
postSchema.methods.addComment = async function(comment) {
const post = this;
post.comments = post.comments.concat({ comment });
await post.save();
return post;
};
Все работает хорошо, но результат отличается от того, что я ожидал. Я ожидал, что это будет похоже на
{
"post": {
"_id": "5e2e94c9e6ef8100ecfaf665",
"title": "Test Post",
"body": "Test Body",
"owner": "5e2e6bbd18929829e8679cec",
"comments": [
{
"_id": "5e2e98d9587c78444cd600b2",
"comment": {
"_id": "5e2e98d9587c78444cd600b1",
"content": "Test Comment",
"owner": "5e2e6bbd18929829e8679cec",
"post": "5e2e94c9e6ef8100ecfaf665",
"__v": 0
}
}
],
},
"comment": {
"_id": "5e2e98d9587c78444cd600b1",
"content": "Test Comment",
"owner": "5e2e6bbd18929829e8679cec",
"post": "5e2e94c9e6ef8100ecfaf665",
"__v": 0
}
}
С первого взгляда все выглядит хорошо, но проблема возникает, когда я пытаюсь сохранить второй комментарий. Комментарий, сохраненный перед изменениями, как показано ниже:
{
"post": {
"_id": "5e2e94c9e6ef8100ecfaf665",
"title": "Test Post",
"body": "Test Body",
"owner": "5e2e6bbd18929829e8679cec",
"comments": [
{
"_id": "5e2e98d9587c78444cd600b2",
"comment": "5e2e98d9587c78444cd600b1"
},
{
"_id": "5e2e98d9587c78444cd600b3",
"comment": {
"_id": "5e2e98d9587c78444cd600b2",
"content": "Test Comment 2",
"owner": "5e2e6bbd18929829e8679cec",
"post": "5e2e94c9e6ef8100ecfaf665",
"__v": 0
}
}
],
},
"comment": {
"_id": "5e2e98d9587c78444cd600b2",
"content": "Test Comment 2",
"owner": "5e2e6bbd18929829e8679cec",
"post": "5e2e94c9e6ef8100ecfaf665",
"createdAt": "2020-01-27T08:01:29.492Z",
"updatedAt": "2020-01-27T08:01:29.492Z",
"__v": 0
}
}
Когда я создал тестовый комментарий 2, первый сохраненный комментарий изменился. Что может вызвать это? Спасибо за чтение такого длинного вопроса. Любая помощь будет оценена! Хорошего дня.