无法在 GraphQL 突变中传递数组 - React Native
Unable to pass array inside GraphQL mutation - React Native
我正在使用 GraphQL 构建 React Native 移动应用程序。现在我一直坚持在 GraphQL 突变中传递数组。我一直在使用 redux-thunk 作为中间件来将数据传递给 GraphQL mutation。
我的 GraphQL 突变信息:
createVirtualChallenge(
name: String!
target: String!
image: String
description: String
from: String!
to: String!
selectedUsers: [String]
): VirtualChallengeResponse!
我一直将选定的用户作为数组传递,如下所示:
["5e2148d4b76df200314f4848", "5e213e6ab76df200314f47c4"]
我的 redux thunk fetch 函数是这样的
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())
所有值都使用 redux 通过 props。
如果数组长度为 1,则此更改有效。但如果数组长度大于 1,则 GraphQL 会抛出错误。
Response from the URL - {"data": null, "errors": [{"extensions":
[Object], "locations": [Array], "message": "virtualChallenge
validation failed: selectedUsers: Cast to Array failed for value \"[
'5e213e6ab76df200314f47c4,5e214493b76df200314f47fa' ]\" at path
\"selectedUsers\"", "path": [Array]}]}
删除该参数的引号,因为该引号用于包装字符串。因为它是一个数组转换成相应的 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 } }`,
}),
切勿使用字符串插值将值注入 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 服务的架构。
我正在使用 GraphQL 构建 React Native 移动应用程序。现在我一直坚持在 GraphQL 突变中传递数组。我一直在使用 redux-thunk 作为中间件来将数据传递给 GraphQL mutation。
我的 GraphQL 突变信息:
createVirtualChallenge(
name: String!
target: String!
image: String
description: String
from: String!
to: String!
selectedUsers: [String]
): VirtualChallengeResponse!
我一直将选定的用户作为数组传递,如下所示:
["5e2148d4b76df200314f4848", "5e213e6ab76df200314f47c4"]
我的 redux thunk fetch 函数是这样的
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())
所有值都使用 redux 通过 props。
如果数组长度为 1,则此更改有效。但如果数组长度大于 1,则 GraphQL 会抛出错误。
Response from the URL - {"data": null, "errors": [{"extensions": [Object], "locations": [Array], "message": "virtualChallenge validation failed: selectedUsers: Cast to Array failed for value \"[ '5e213e6ab76df200314f47c4,5e214493b76df200314f47fa' ]\" at path \"selectedUsers\"", "path": [Array]}]}
删除该参数的引号,因为该引号用于包装字符串。因为它是一个数组转换成相应的 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 } }`,
}),
切勿使用字符串插值将值注入 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 服务的架构。