当我使用Apollo时,对象数组转换为对象对象

时间:2018-12-05 17:16:45

标签: javascript graphql apollo

在我们的项目中,我们使用Apollo客户端将查询发送到GraphQL。奇怪的是,它将变量转换为对象的对象。

let variables = [{myField: "myVal"}];
graphql.mutate("mutate myFunction($data:[MyInputType]){
    myFunction(myArg: $data){...blabla...}
}", variables);

当我运行变异并检查请求标头时,我看到我的变量被转换为对象的对象。

{"0": {"myField": "myVal"}}

此方法是否默认将变量强制为对象?是否可以使用GraphQL将对象数组作为参数发送?

1 个答案:

答案 0 :(得分:1)

执行查询时,GraphQL期望variables是一个对象,其中键是变量名,值是相应的变量值。必须在文档的操作定义旁边声明文档中使用的每个变量(您发送的整个查询)。例如,如果您有一个名为firstName的变量String

mutation SomeOperationName ($firstName: String) {
  # your mutation here
}

您可以包含任意数量的变量:

mutation SomeOperationName ($firstName: String, $lastName: String, points: Int)

变量也可以是列表:

mutation SomeOperationName ($names: [String], points: Int)

在所有这些情况下,传递给variables的{​​{1}}的值仍然需要是一个对象:

mutate

在您的示例中,您仅定义了一个变量{ names: ['Bob', 'Susan'], points: 12, } ,您已经将它告诉GraphQL是data的{​​{1}}。您无法将List作为变量传递,因为您没有告诉GraphQL该变量存在。但是,如果MyInputTypemyField上的一个字段,那么您的myField只需看起来像这样:

MyInputType