Невозможно передать массив внутри мутации GraphQL - React Native - PullRequest
2 голосов
/ 19 января 2020

Я создавал мобильное приложение React Native с помощью GraphQL. Теперь я застрял с передачей массива внутри мутации GraphQL. Я использовал redux-thunk в качестве промежуточного программного обеспечения для передачи данных в мутацию GraphQL.

Моя информация о мутациях в GraphQL:

createVirtualChallenge(
name: String!
target: String!
image: String
description: String
from: String!
to: String!
selectedUsers: [String]
): VirtualChallengeResponse!

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

["5e2148d4b76df200314f4848", "5e213e6ab76df200314f47c4 "]

Моя функция выборки из избыточного редукса выглядит следующим образом

   fetch(URL.BASE_URL, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Authorization: 'Bearer ' + token,
        },
        body: JSON.stringify({
          query: `mutation{ createVirtualChallenge( name:"${name}", target:"${target}", image:"${image_name}", description:"${description}", from:"${from}", to:"${to}", selectedUsers: "${selectedUsers}" , ){ success } }`,
        }),
      })
        .then(res => res.json())

Все значения проходят через реквизиты с использованием избыточности.

Если длина массива равна 1 , тогда эта мутация работает .. Но если длина массива больше 1, то GraphQL выдает ошибку.

Ответ с URL - {"data": null, "errors": [{" extensions ": [Object]," location ": [Array]," message ":" проверка virtualChallenge завершилась неудачно: selectedUsers: сбой приведения к массиву для значения \ "['5e213e6ab76df200314f47c4,5e214493b76df200314f47fa'] \" по пути \ "selectedUsers \" "," path ": [Array]}]}

Ответы [ 2 ]

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

Никогда не используйте строковую интерполяцию для ввода значений в запрос GraphQL. Предпочтительным способом является использование переменных, которые могут быть отправлены вместе с вашим запросом как JSON объект, который служба GraphQL будет анализировать соответствующим образом.

Например, вместо

mutation {
  createVirtualChallenge(name: "someName"){
    success
  }
}

вы напишет:

mutation ($name: String!) {
  createVirtualChallenge(name: $name){
    success
  }
}

, а затем передаст значение для name вместе с вашим запросом:

fetch(
  ...
  body: JSON.stringify({
    query: `...`,
    variables: {
      name: 'someName',
    },
  }),
)

Используйте переменную для каждого значения аргумента, которое вы хотите динамически вставить в ваш запрос , Это проще, чем пытаться ввести значения самостоятельно, поскольку вам не нужно беспокоиться о синтаксисе c, заданном в GraphQL - вы просто передаете объект JSON. Однако вам нужно будет знать тип каждого аргумента, который вы заменяете таким образом, поэтому вам нужно обратиться к схеме вашей службы GraphQL.

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

Удалить кавычки для этого аргумента, поскольку кавычка используется для переноса строки. Поскольку это массив, преобразуйте его в соответствующую строку JSON и который будет действительным вводом массива для graphql.

selectedUsers: "${selectedUsers}" ===> selectedUsers: ${JSON.stringify(selectedUsers)}

body: JSON.stringify({
  query: `mutation{ createVirtualChallenge( name:"${name}", target:"${target}", image:"${image_name}", description:"${description}", from:"${from}", to:"${to}", selectedUsers: ${JSON.stringify(selectedUsers)}  ){ success } }`,
}),
...