Как получить массив всех экземпляров таблицы и их подкомпоненты Node.js? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать приложение-викторину с node.js в качестве внутреннего языка. Я пытаюсь получить все вопросы и для каждого вопроса в массиве другой массив «ответов» с каждым ответом на этот вопрос. Я хочу получить эту информацию в виде запроса на получение.

pi c таблиц моей базы данных

формат вывода, который я хочу, будет выглядеть следующим образом:

[
    {
        "questionText": "Question1How much do you like Python?",
        "answers": [
            {
                "answerText": "Q1RESPONSE OPTION 1",
                "isCorrect": false,
                "score": 0
            },
            {
                "answerText": "Q1RESPONSE OPTION 2",
                "isCorrect": true,
                "score": 10
            }
        ]
    },
    {
        "questionText": "Question2How much do you like Python?",
        "answers": [
            {
                "answerText": "Q2RESPONSE OPTION 1",
                "isCorrect": false,
                "score": 0
            },
            {
                "answerText": "Q2RESPONSE OPTION 2",
                "isCorrect": true,
                "score": 10
            }
        ]
    }
]

До сих пор я делал эту функцию контроллера для запроса на получение

const getAllAnswersForQuestion = async (req, res) => {
  try {
    let question_id = req.params.question_id;
    const question = await Question.findOne({ where: { id: question_id } });
    const answers = await Answer.findAll({
      where: {
        questionId: question_id
      }
    })
    if (answers.length > 0) {
      res.status(200).send({ question, answers });
    } else
      res.status(404).json({ message: "question has 0 answers" });

  } catch (e) {
    console.error(e);
    res.status(500).send({ message: "server error" });
  }
};

Но получаемый мной результат выглядит так:

{
    "question": {
        "id": 1,
        "questionText": "Q1How much do you like Python?",
        "testId": 1
    },
    "answers": [
        {
            "id": 1,
            "answerText": "Q1RESPONSE OPTION 1",
            "isCorrect": false,
            "score": 0,
            "questionId": 1
        },
        {
            "id": 2,
            "answerText": "Q1RESPONSE OPTION 2",
            "isCorrect": true,
            "score": 10,
            "questionId": 1
        }
    ]
}

У вас есть любая идея о том, как я могу создать функцию для добавления к выходному объекту массива подкомпонентов, например, для каждого вопроса, чтобы вернуть ответы внутри своего объекта, а затем вернуть все вопросы, как указано выше?

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Итак, мне удалось решить эту проблему, создав другую функцию, я не знаю, поможет ли это кому-нибудь когда-нибудь, но я оставлю это здесь. Часть raw: true очень важна для получения только данных в таблице без дополнительных вещей, добавленных к объекту в браузере.

const getAllQuestions = async (req, res) => {
      try {
        let test_id = req.params.test_id;
        const questions = await Question.findAll({raw:true, where:{
          testId:test_id
        }}).then(async (questionsFound) => {
          for (let i = 0; i < questionsFound.length; i++) {
            questionsFound[i].answers = await getAllAnswersQuestion(questionsFound[i].id)
          }
          return questionsFound;
        });

        res.status(200).send(questions);
      } catch (e) {
        console.error(e);
        res.status(500).send({ message: "server error" });
      }
    }

    const getAllAnswersQuestion = async (id) => {    
        const answers = await Answer.findAll({
          where: {
            questionId: id
          },
          raw: true
        })

        return answers
    };

Я не хотел использовать mon goose, потому что для меня это что-то новенькое.

0 голосов
/ 07 мая 2020

Итак, у вас должны быть две схемы, которые нужно связать, и при поиске вопросов просто заполните каждый ответ.

Пример:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const questionSchema = Schema({
  _id: Schema.Types.ObjectId,
  questionText: String,
  /// ...
  answers: [{ type: Schema.Types.ObjectId, ref: 'Answer' }]
});

const Question = mongoose.model('Question ', questionSchema );

const answerSchema = Schema({
  answerText: String,
  isCorrect: Boolean,
  /// ...
});

const Answer = mongoose.model('Answer', answerSchema );

Ищите вопросы с ответами на все:

const getAllAnswersForQuestion = async (req, res) => {
  try {
    let question_id = req.params.question_id;
    const question = await Question.findOne({ where: { id: question_id } }).populate("answers") // populate the property you want, in this case "asnwers"

    if (question .length > 0) {
      res.status(200).send({ question});
    } else
      res.status(404).json({ message: "question has 0 answers" });

  } catch (e) {
    console.error(e);
    res.status(500).send({ message: "server error" });
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...