как сделать запрос GET для возврата информации во вложенном объекте, Mongoose Express

#javascript #express #mongoose #get #postman

#javascript #экспресс #mongoose #получить #почтальон

Вопрос:

Я пытался сделать запрос get, который вернет все объекты в моем вложенном объекте в моей пользовательской схеме. при создании маршрута я получаю пользователя по идентификатору, а затем пытаюсь получить доступ к свойству classwork внутри него, которое представляет собой вложенный объект, содержащий массив объектов classwork, которые имеют свои собственные свойства. Как я могу сделать запрос GET, чтобы показать JSON только для классной работы пользователя?

Модель

 const mongoose = require("mongoose");

const Schema = mongoose.Schema;

const ClassworkSchema = new Schema({
    name: String,
    time: Date,
    todo: String,
    isDone: false
});

const OutcomesSchema = new Schema({
    name: String,
    time: Date,
    todo: String, 
    isDone: false,
    isApproved: false
})

const MeetupSchema = new Schema({
    name: String,
    time: Date,
    location: String,
    attended: false
})
const UserSchema = new Schema({
    name: {
      type: String,
      required: true
    },
    email: {
      type: String,
      required: true
    },
    password: {
      type: String,
      required: true
    },
    date: {
      type: Date,
      default: Date.now
    },
    classwork: [ClassworkSchema],
    outcomes: [OutcomesSchema],
    meetups: [MeetupSchema],
  });



module.exports = User = mongoose.model('users', UserSchema);
 

Запрос GET

   classworkRouter.get('/:userId/classwork', (req, res) => {
        User.findById(req.params.userId).populate('classwork').exec((err, data) => {
          if (err || !data) {
            res.status(404).json({error: 'user not found'});
          } else {
            res.json({data});
          }
        });
      });

 

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

1. У вас возникли трудности с проверкой ответа, который вы получаете на запрос get, используя Postman?

2. если вы хотите отправлять только выбранные данные пользователю, вы можете использовать . выберите (‘fieldName’) после заполнения

3. Post man возвращает всю информацию о пользователе, но мне просто нужен массив объектов classwork, а не вся информация о пользователе.

Ответ №1:

вы можете, следуя этому коду

   classworkRouter.get('/:userId/classwork', (req, res) => {
        User.findById(req.params.userId).populate('classwork' ,'classwork').exec((err, data) => {
          if (err || !data) {
            res.status(404).json({error: 'user not found'});
          } else {
            res.json({data});
          }
        });
      });
 

пожалуйста, ознакомьтесь с документацией

Ответ №2:

это было бы работой

 classworkRouter.get('/:userId/classwork', (req, res) => {
  User.findById(req.params.userId).populate('classwork').exec((err, data) => {
    if (err || !data) {
      res.status(404).json({ error: 'user not found' });
    } else {
      res.json({ data: user.classwork });
    }
  });
});
 

и это тот же код, но немного изменил мой стиль

 classworkRouter.get('/:userId/classwork', async (req, res) => {
  try {
    const user = await User.findById(req.params.userId).populate('classwork')
    if (!user) throw
    return res.status(200).json({ data: user.classwork })
  } catch (err) {
    res.status(404).json({ error: 'user not found' });
  }
})