基本上,我想做的是将一个字符串ex列表: [“ aa”,“ bb”,“ vv”] 发送到graphql Mutation字段中,当前这是我的Mutation Schema < / p>
"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 Server中接收字符串列表。谢谢! :)
更新 当我呼叫 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
答案 0 :(得分:1)
根据错误消息,您的问题在于以下行:
list := p.Args["listTest"].([]string)
p.Args["listTest"]
返回[]interface{}
。
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类型的方法,以便以更有用的方式获取值。