【问题标题】:Golang Mutation with a list as a param variable (GRAPHQL)将列表作为参数变量的 Golang Mutation (GRAPHQL)
【发布时间】:2019-01-13 21:38:03
【问题描述】:

基本上,我想要做的是将字符串 ex: ["aa","bb","vv"] 列表发送到 graphql Mutation 字段,目前这是我的 Mutation Schema

"listTest": &graphql.Field{
            Type: QueryMessageType,
            Args: graphql.FieldConfigArgument{
                "listNew": &graphql.ArgumentConfig{
                    Description: "Example List of Json String",
                    Type:        graphql.NewList(graphql.NewNonNull(graphql.String)),
                },
            },
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                list := p.Args["listTest"].([]string)
                return listTest(list)
            },
        },

和方法listTest

func listTest(testing[]string) (*QueryMessage, error) {
    fmt.Println(testing)
    return &QueryMessage{
        QueryBody: "nothing to do here",
    }, nil
}

但是,当我在 INSOMNIA 中提出请求时,响应是:

{
    "data": {
        "listTest": null
    },
    "errors": [
        {
            "message": "interface conversion: interface {} is []interface {}, not []string",
            "locations": []
        }
    ]
}

请求是这样的:

mutation{
    listTest(listNew: ["aa","bb","vv"]){
        querybody
    }
}

谁能告诉我如何在我的 Go 服务器中接收字符串列表。谢谢! :)

更新 当我调用 fmt.Println(p.Args["listTest"])

结果是:[aa bb vv]

已解决

按照投票答案的说明,脚本现在可以完成他的工作。这是最终结果:

Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                var groupIDs []string
                for _, gid := range p.Args["list"].([]interface{}) {
                    groupIDs = append(groupIDs, gid.(string))
                }

                for _, final := range groupIDs {
                    fmt.Println(final)
                }
                return listTest(groupIDs)
            },

在控制台中我得到了这个:

aa
bb
vv

【问题讨论】:

    标签: go graphql


    【解决方案1】:

    根据错误消息,您的问题在于这一行:

     list := p.Args["listTest"].([]string)
    

    p.Args["listTest"] 正在返回 []interface{}

    interface{} 可以存储任何其他类型。如果你熟悉 java,它有点像Object

    这里的问题是您的字段来自p.Args["listTest"],并且您尝试将其键入到[]string。如果存储在 args 中的值是 interface{} (any),这将起作用。但事实并非如此,p.Args(根据错误)持有[]interface{}。这是一个接口值的切片,其中每个都可以是任何东西(而不是一个包含字符串切片的单个接口值。)

    而是尝试遍历该接口列表,然后键入断言每个值。

    var strs []string
    for _, v := range p.Args["list"].([]interface{}) {
        strs = append(strs, v.(string))
    }
    

    或者研究另一种设置 graphQL 类型的方法,以便以更有用的方式获取值。

    【讨论】:

    • 您先生,完全正确!谢谢:),我要编辑这个问题,所以如果有人遇到这样的问题,知道如何解决它。
    猜你喜欢
    • 2021-03-30
    • 2018-12-08
    • 2020-07-05
    • 2021-07-04
    • 2021-11-03
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多