Я создавал мобильное приложение 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"]

Моя функция извлечения редукса Thunk такая

   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": "Проверка виртуального вызова не выполнена: selectedUsers: Ошибка приведения к массиву для значение \ "['5e213e6ab76df200314f47c4,5e214493b76df200314f47fa'] \" по пути \ "selectedUsers \" "," path ": [Array]}]}

2
Akila Devinda 19 Янв 2020 в 10:14

2 ответа

Лучший ответ

Удалите кавычки для этого аргумента, поскольку кавычка используется для переноса строки. Поскольку это массив, преобразуйте его в соответствующую строку 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 } }`,
}),
1
Pranav C Balan 19 Янв 2020 в 07:54

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

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

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

Вы бы написали:

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

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

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

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

1
Daniel Rearden 19 Янв 2020 в 07:50