使用 apollo 改变数组

Mutating an array with apollo

我有一个具有这种突变类型的服务器端模式

type Mutation {
  updateSettings(settings: SettingsInput): Settings
}
input SettingsInput {
  repositories: [RepositoryInput]
}
input RepositoryInput {
  id: String
  name: String
  url: String
}

如果我使用像 Altair 这样的客户端,我可以完全按照我想要的方式改变它,通过这个查询:

mutation{
  updateSettings(settings: {
    repositories: [
      {
         name: "name1"
         url: "url1"
      },
      {
         name: "name2"
         url: "url2"
      }
    ]
  }){
    repositories {
      id
      name
      url
    }
  }
}

但是我在使用 Apollo 时很难让它正常工作

我能得到的最好的就是这个

import { SubscriptionClient } from "subscriptions-transport-ws";
import { gql } from "apollo-boost";
import { WebSocketLink } from "apollo-link-ws";

const wsClient = new SubscriptionClient("ws://localhost:5001/graphql", {
  reconnect: true
});
const client = new WebSocketLink(wsClient);
const UPDATE_SETTINGS = gql`
  mutation UpdateSettings($settings: SettingsInput) {
    updateSettings(settings: $settings) {
      repositories {
        id
        name
        url
      }
    }
  }
`;
client
      .request({
        query: UPDATE_SETTINGS,
        variables: { repository: [{name: "name1", url:"url1"},
                                  {name: "name2", url:"url2"}]}
      })

我显然遗漏了一些东西。客户端似乎不知道服务器 SettingsInput,但我真的不知道如何为客户端创建一个将复杂对象或数组作为变量的查询。

我是不是以一种完全奇怪的方式来解决这个问题,或者我该如何从 apollo 客户端向服务器发送 "complex" 突变?

除了客户端,您还需要修复您传入的 variables 对象。您在操作中定义的变量名为 settings,但您只是传入一个名为 repository 的变量。此外,此变量的形状与架构中显示的 SettingsInput 不匹配。 variables 应该类似于:

const variables = {
  settings: {
    repositories: [
      {
        name: 'name1',
        url: 'url1'
      },
      {
        name: 'name2',
        url: 'url2'
      },
    ],
  },
}