Как передать объект JSON в grpahql и strapi - PullRequest
0 голосов
/ 29 января 2019

Когда я вручную пишу запрос на мутацию (в плагине graphql), он работает:

mutation {
                    createExam(input: {
                      data: {
                        name: "myName"
                        desription: "ggg"
                        questions: [{gf: "hello"}]
                        time: 2
                        subjects: ["5c468e2d61670b25b46ccdfe"]
                      }
                    }) {
                      exam {
                        name
                                desription
                        time

                      }
                    }
                  }

Но если я закодирую его и передам точно такой же массив, я получу массив точно такого же объекта, который получу[ноль, ноль]

let parsedQuestion = [{gf: "hello"}];

 const response = await strapi.request('POST', '/graphql', {
            data: {
                query: `mutation {
                    createExam(input: {
                      data: {
                        name: "` + examInfo.newExamName + `"
                        desription: "` + examInfo.newExamDescription + `"
                        time: ` + Number(examInfo.newExamTime) + `,
                        questions: `+ parsedQuestion + `, 
                        subjects: ["` + this.state.modalSubject._id + `"]
                      }
                    }) {
                      exam {
                        name
                        desription
                        time
                        questions

                      }
                    }
                  }`
            }

Как это может быть?Может ли это быть ошибкой?Я также попытался с JSON.stringify, но затем получил ошибку, и мутация даже не прошла

Заранее большое спасибо

1 Ответ

0 голосов
/ 30 января 2019

Построение строки запроса таким способом подвержено ошибкам и опасно;он открывает вам множество ошибок и известных уязвимостей безопасности.(Что если newExamName равно My "super-duper" exam!!!?)

GraphQL предоставляет переменные в качестве лучшего подхода для передачи данных. В вашем случае, поскольку у вас есть сложный, несколько структурированный объект, это, вероятно,проще всего передать весь вход как один объект (возможны другие синтаксисы).Я ожидал бы, что это будет выглядеть примерно так:

const response = await strap.request('POST', '/graphql', {
  data: {
    query: `mutation CreateExam($input: CreateExamInput!) {
      createExam(input: $input) {
        exam { name, desription, time, questions }
      }
    }`,
    variables: {
      input: {
        name: examInfo.newExamName,
        desription: examInfo.newExamDescription,
        time: Number(examInfo.newExamTime),
        questions: [{gf: "hello"}],
        subjects: [this.state.modalSubject._id]
      }
    }
  }
});

Теперь клиентская библиотека HTTP может взять на себя ответственность за создание правильно сформированного JSON из вашего ввода, и вы не выполняете хитрые манипуляции со строками.

...