【问题标题】:Graphql Mutation with Array types具有数组类型的 Graphql 突变
【发布时间】:2020-09-22 16:07:54
【问题描述】:

我正在尝试编写一个突变查询,它与 graphql 完美配合

mutation($project: ProjectsInput) {
  NewProject(project: $project) {
    name,
    namespace,
    environments{
      env,      
    }}}

这些是查询变量

{"project": {
   "name": "Pr1",
  "namespace": "Pr2",
  "environments": 

  [{"env": "rec"},{"env": "dev"}]


}}

这就是它的外观 graphql mutation 现在我正在尝试使用 Apollo Client 来构建这种突变,就像这样


    createProject() {
    this.apollo.mutate({
      mutation: gql`
      mutation($project: ProjectsInput) {
        NewProject(project: $project) {
          name,
          namespace,
          environments{
            env,      
          }
    `,
      variables: { 
        project: {
          name: "sth",
          namespace: "sth2",
          env: [
            {env:"env1"},
            {env:"env2"}
          ]
        } 
      }
    }).subscribe(data => {
      console.log('New project created!', data);

    });  }

但是由于 Array 类型的变量 $env,我收到了 Http 失败响应。我想将数组作为变量传递给 apollo 客户端中的查询。我对字符串类型的变量没有问题,但是数组对象会导致此错误。

【问题讨论】:

  • 使用 graphiql 文档检查突变签名 - 可能是一个输入变量 - 将所有数据作为一个输入对象(匹配一个输入变量)传递,尝试使用 graphiql 使用query variables(以下查询)...然后使用代码(apollo-client)
  • 感谢您的回复,实际上我尝试了两个输入变量并且效果很好。问题是我与数组列表类型堆叠在一起。我想动态地持久化该对象数组。问候

标签: angular graphql symfony4 apollo-client graphiql


【解决方案1】:

NewProject(project: 表明您的NewProject 突变需要一个project 参数

将查询更改为

mutation($project: ProjectsInput) {
  NewProject(project: $project) {
    name,
    namespace,
    environments{
      env,      
    }

并将一个,整个对象传递给变量project

graphiql 中使用query variables 来定义测试变量:

{ 
  project: {
    name: "sth",
    namespace: "sth2",
    environments: [
      {env:"env1"},
      {env:"env2"}
    ]
  } 
}

然后在客户端为project 变量准备相同类型的对象(当然,其结构与您的突变输入类型匹配)。

【讨论】:

  • 谢谢先生,但这不是问题。查询工作正常。问题是数组“env”的大小不是静态的(一个项目有很多由管理员修复的环境)。字符串变量不会导致问题。在这种情况下,当我从 apollo 请求中删除 $env 变量时它工作正常,但是当我添加数组时出现错误。
  • 显示您的突变签名 - 来自 graphiql ...和此突变中使用的输入类型定义
  • 我已经编辑了帖子。我想要做的是将对象数组添加到 apollo 客户端 request.regards
  • 什么都没有改变 .... 只有我们知道输入类型名称;)ProjectsInput,仍然准备一个对象,首先在 graphiql 中尝试(使用查询变量!!不是硬编码结构和传递子属性),然后在代码中重新创建
  • 我按照你说的做了,我再次编辑了这篇文章。我现在正在使用图片中的查询变量(在帖子中编辑)。问题实际上不在后端 Api 中,而是在 apollo 客户端请求中。我希望我能理解你想要告诉我的内容。谢谢
猜你喜欢
  • 2020-12-09
  • 2021-10-19
  • 2019-07-20
  • 2019-11-18
  • 2017-12-20
  • 2020-07-02
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多