登录
首页 >  Golang >  Go问答

在 Golang 中使用列表作为 GraphQL Mutation 的参数

来源:stackoverflow

时间:2024-03-26 20:12:38 315浏览 收藏

在 Go 语言中构建 GraphQL 变异时,使用列表作为参数需要一些技巧。最初尝试将字符串列表发送到变异字段时遇到挑战,但通过以下步骤解决了问题: 1. 识别错误:错误消息指出参数类型不匹配,因为 `p.args["listtest"]` 返回 `[]interface{}` 而不是 `[]string`。 2. 遍历接口列表:使用循环遍历 `p.args["list"]` 中的接口列表,并将每个值强制转换为字符串类型,将其添加到新列表 `strs` 中。 3. 更新解析器:将解析器函数更新为使用 `strs` 而不是直接访问 `p.args["listtest"]`。

问题内容

基本上我想做的就是将字符串列表发送到 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

解决方案


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

list := p.args["listtest"].([]string)

p.args["listtest"] 正在返回 []接口{}

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

这里的问题是您的字段来自 p.args["listtest"],并且您尝试将其断言键入 []string。如果 args 中存储的值为 interface{}(任意),则此方法有效。但事实并非如此,p.args(根据错误)保存着[]interface{}。这是接口值的切片,其中每个值都可以是任何内容(而不是包含字符串切片的单个接口值。)

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

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

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

理论要掌握,实操不能落!以上关于《在 Golang 中使用列表作为 GraphQL Mutation 的参数》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>