Mon goose добавить схему в схему, используя метод - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать блог, который использует 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, первый сохраненный комментарий изменился. Что может вызвать это? Спасибо за чтение такого длинного вопроса. Любая помощь будет оценена! Хорошего дня.

1 Ответ

1 голос
/ 27 января 2020

Проблема в том, что вы передаете свой полный комментарий вместо его идентификатора.

  await post.addComment(comment_id); // pass comment id here 

Потому что в вашей пост-модели

comments: [
      {
        comment: {
          type: mongoose.Schema.Types.ObjectId, // you are storing ObjectId here 
          ref: "Comment"
        }
      }
    ]

Итак, вы можете хранить свои комментарии в виде массива идентификатор комментария, а затем вы можете получить полные комментарии, когда захотите его заполнить

...