【问题标题】:Mutation arguments as object变异参数作为对象
【发布时间】:2019-02-15 01:55:37
【问题描述】:

我正在使用Go implemenatation of GraphQL

您将如何配置突变,以便它可以接收超过 1 级的参数? 例如,这是我想传递给突变 CreateUser 的参数列表:

mutation createUser($user: CreateUser!) {
  createUser(input: $user)
}

{
  "user": {
    "name": {
      "first": "John",
      "last": "Doe"
    },
    "email": "john@doe.com"
  }
}

(请注意,我不想使用 firstnamelastname 而是使用 name 对象)

这是我迄今为止的(不成功的)尝试:

var CreateUserInput = graphql.FieldConfigArgument{
    "input": &graphql.ArgumentConfig{
        Description: "Input for creating a new user",
        Type: graphql.NewNonNull(graphql.NewInputObject(graphql.InputObjectConfig{
            Name: "CreateUser",
            Fields: graphql.InputObjectConfigFieldMap{
                "name": &graphql.InputObjectFieldConfig{
                    Type: graphql.NewNonNull(graphql.NewInputObject(graphql.InputObjectConfig{
                        Fields: graphql.InputObjectConfigFieldMap{
                            "first": &graphql.InputObjectFieldConfig{
                                Type: graphql.NewNonNull(graphql.String),
                            },
                            "last": &graphql.InputObjectFieldConfig{
                                Type: graphql.NewNonNull(graphql.String),
                            },
                        },
                    })),
                },
                "email": &graphql.InputObjectFieldConfig{
                    Type: graphql.NewNonNull(graphql.String),
                },
            },
        })),
    },
}

显然,子字段 firstlast 无法识别,因为这是我在运行此突变时得到的:

{
  "data": null,
  "errors": [
    {
      "message": "Variable \"$user\" got invalid value {\"email\":\"john@doe.com\",\"name\":{\"first\":\"john\",\"last\":\"doe\"}}.\nIn field \"name\": In field \"first\": Unknown field.\nIn field \"name\": In field \"last\": Unknown field.",
      "locations": [
        {
          "line": 1,
          "column": 21
        }
      ]
    }
  ]
}

这可能吗?

编辑:在接受的答案中查看 cmets 以获得解决方案。

【问题讨论】:

    标签: go graphql graphql-go


    【解决方案1】:

    这是我第一次使用 Go,但我会尝试传达我认为的问题所在。

    首先让我们谈谈你想要的结构。我将在这里使用 SDL:

    type Mutation {
      createUser(user: CreateUser!): Boolean! # Maybe return user type here?
    }
    
    input CreateUser {
      name: CreateUserName!
      email: String!
    }
    
    input CreateUserName {
      first: String!
      last: String!
    }
    

    好的,现在我们知道我们需要两种输入类型,让我们开始吧!

    var CreateUserName = graphql.NewInputObject(graphql.InputObjectConfig{
        Name: "CreateUserName",
        Fields: graphql.InputObjectConfigFieldMap{
            "first": &graphql.InputObjectFieldConfig{
                Type: graphql.NewNonNull(graphql.String),
            },
            "last": &graphql.InputObjectFieldConfig{
                Type: graphql.NewNonNull(graphql.String),
            },
        },
    })
    
    var CreateUser = graphql.NewInputObject(graphql.InputObjectConfig{
        Name: "CreateUser",
        Fields: graphql.InputObjectConfigFieldMap{
            "name": &graphql.InputObjectFieldConfig{
                Type: graphql.NewNonNull(CreateUserName),
            },
            "email": &graphql.InputObjectFieldConfig{
                Type: graphql.NewNonNull(graphql.String),
            },
        },
    })
    

    现在剩下的就是将突变字段添加到您的突变对象类型中。

    【讨论】:

    • 如果您仔细查看我的代码,这正是我已经拥有的。我没有创建两种单独的输入类型,而是创建了一个包含所有内容的输入类型,但最终它是相同的。我也没有提到它,但我显然已将输入对象添加到突变类型。
    • 您缺少例如嵌套输入类型中的 name 属性。不确定这是否相关。
    • 我刚刚测试过了,是的,我只需要添加 name 属性!谢谢 :) 我只是希望错误消息可以更明确哈哈
    • 我建议按照我的方式对类型定义进行分组,以便更容易捕捉到:)
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2019-01-02
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多