Mon goose Объект возвращает неопределенный при заполнении - PullRequest
0 голосов
/ 06 марта 2020

Я борюсь с небольшой проблемой. Я хочу заполнить пользователей комментариями.

Схема пользователя:

const userSchema = mongoose.Schema({
  username: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true
  }
});

Схема комментариев:

const commentSchema = mongoose.Schema({
  comment:{
    type: String
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
});

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

Комментарий:

Comment.find({}).exec((err, comments) => {
  console.log(comments);
});

Вывод:

[
 {
   _id: 5e62472d5f593f3c642ee1e5,
   comment: 'something',
   user: 5e624522366d8c4150278a64,
   __v: 0
 }
]

Пользователь:

User.find({}).exec((err, users) => {
  console.log(users);
});

Выход:

[
 {
  _id: 5e624522366d8c4150278a64,
  username: "SomeBodY", 
  password: "$2a$10$nm5BJ7zeI1tet3UEzcakf.8xoTgV/Yti5l1EKNg5inxiehevUlGRm"
 }
]

Проблема в том, что я использую .populate('user') для * Модель 1036 * возвращает комментарий как undefined в консоли. Я пробовал разные методы и даже отбрасывал базу данных, но безуспешно.

Вот маршрут, когда это происходит

// Route To Single Project
router.get('/:projectId', (req, res) => {
  const requestedProjectId = req.params.projectId;
  Project.findById({_id: requestedProjectId}).populate('image_file').exec((err, project) => {
    Rating.find({projectId: requestedProjectId}, (err, ratings) => {
      Rating.countDocuments({projectId: requestedProjectId}, (err, count) => {
        Comment.find({projectId: requestedProjectId}).populate('user').exec((err, comments) => {
          console.log(comments)
          if(err) return next(err);
          res.render('project', { ... });
        });
      });
    });
  });
});

1 Ответ

0 голосов
/ 06 марта 2020

На самом деле ваш заполненный код соответствует действительности.

Причина получения пустых комментариев заключается в том, что Comment.find({projectId: requestedProjectId}), кажется, возвращает пустое. Так что просто проверьте параметр запроса.

Также, чтобы избавиться от ада обратного вызова, вы можете переписать свой маршрут, используя async / await, как это.

router.get("/:projectId", async (req, res) => {
  const requestedProjectId = req.params.projectId;

  try {
    const project = await Project.findById({ _id: requestedProjectId }).populate("image_file");

    if (!project) {
      return res.status(400).send("Project not found, check your projectId");
    }

    const comments = await Comment.find({ projectId: requestedProjectId }).populate("user");
    console.log(comments);

    const ratings = await Rating.find({ projectId: requestedProjectId });

    const count = await Rating.countDocuments({ projectId: requestedProjectId });

    res.render("project", {
      project,
      comments,
      ratings,
      count
    });
  } catch (err) {
    console.log("Error: ", err);
    res.status(500).send("Something went wrong");
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...