Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用阿波罗变异阵列_Javascript_Graphql_Apollo_Apollo Client_Graphql Mutation - Fatal编程技术网

Javascript 用阿波罗变异阵列

Javascript 用阿波罗变异阵列,javascript,graphql,apollo,apollo-client,graphql-mutation,Javascript,Graphql,Apollo,Apollo Client,Graphql Mutation,我有一个这种变异类型的服务器端模式 type Mutation { updateSettings(settings: SettingsInput): Settings } input SettingsInput { repositories: [RepositoryInput] } input RepositoryInput { id: String name: String url: String } 如果我使用诸如Altair之类的客户机进行此查询,我可以完全按照我想要

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

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
    }
  }
}
然而,当我使用阿波罗时,我正在努力让它工作

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

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"}]}
      })
我显然错过了什么。客户端似乎不知道服务器设置的输入,但我真的不知道如何为客户端创建一个以复杂对象或数组为变量的查询


我是以一种完全奇怪的方式来处理这个问题,还是我应该如何从apollo客户端向服务器发送复杂的变异?

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

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

订阅传输ws用于订阅。它不是查询和突变的合适传输。现在还不清楚为什么要用它来代替apollo客户端或apollo-boost。主要是因为我认为它是一种只通过一个客户端发送数据的更干净的方式。我也支持这一点,在同一个客户端上使用订阅和查询,而在WebSocket上实现查询和变异在技术上可能是可行的,例如,几乎所有的服务器端库都将GraphQL服务公开为端点,Apollo Server仅支持通过POST/GET请求接收查询和突变。使用WebSocket作为这些操作的传输需要在前端和后端进行大量的工作。您应该按照图中所示实现订阅支持。好的,公平有效。然而,apollo客户端似乎遵循相同的客户端查询结构,因此,对于如何将对象列表定义为查询变量,我可能同样感到困惑。但我错了吗?这是否以不同的方式处理?