首页 文章

graphql-go:使用Object作为查询的输入参数

提问于
浏览
6

我试图将一个对象作为参数传递给查询(而不是标量) . 从文档看来,这应该是可能的,但我无法弄清楚如何使其工作 .

我正在使用graphql-go,这是测试模式:

var fileDocumentType = graphql.NewObject(graphql.ObjectConfig{
Name: "FileDocument",
Fields: graphql.Fields{
    "id": &graphql.Field{
        Type: graphql.String,
        Resolve: func(p graphql.ResolveParams) (interface{}, error) {
            if fileDoc, ok := p.Source.(data_format.FileDocument); ok {
                return fileDoc.Id, nil
            }
            return "", nil
        },
    },
    "tags": &graphql.Field{
        Type: graphql.NewList(tagsDataType),
        Args: graphql.FieldConfigArgument{
            "tags": &graphql.ArgumentConfig{
                Type: tagsInputType,
            },
        },
        Resolve: func(p graphql.ResolveParams) (interface{}, error) {
            fmt.Println(p.Source)
            fmt.Println(p.Args)
            if fileDoc, ok := p.Source.(data_format.FileDocument); ok {
                return fileDoc.Tags, nil
            }
            return nil, nil
        },
    },

},
})

我正在尝试使用的输入类型(我已尝试过InputObject和标准对象)

var tagsInputType = graphql.NewInputObject(graphql.InputObjectConfig{
Name: "tagsInput",
Fields: graphql.Fields{
    "keyt": &graphql.Field{
        Type: graphql.String,
    },
    "valuet": &graphql.Field{
        Type: graphql.String,
    },
},
})

这是我用来测试的graphql查询:

{
        list(location:"blah",rule:"blah")
        {
            id,tags(tags:{keyt:"test",valuet:"test"})
            {
                key,
                value
            },
            {
                datacentre,
                handlerData
                {
                    key,
                    value
                }
            }
        }
    }

我收到以下错误:

wrong result, unexpected errors: [Argument "tags" has invalid value {keyt: "test", valuet: "test"}.
In field "keyt": Unknown field.
In field "valuet": Unknown field.]

问题是,当我将类型更改为字符串时,它工作正常 . 如何将对象用作输入arg?

谢谢!

1 回答

  • 12

    有同样的问题 . 这是我通过graphql-go源找到的内容 .

    InputObjectFields 必须是 InputObjectConfigFieldMapInputObjectConfigFieldMapThunk 类型才能使pkg正常工作 .

    所以 InputObject 看起来像这样:

    var inputType = graphql.NewInputObject(
        graphql.InputObjectConfig{
            Name: "MyInputType",
            Fields: graphql.InputObjectConfigFieldMap{
                "key": &graphql.InputObjectFieldConfig{
                    Type: graphql.String,
                },
            },
        },
    )
    

    修改Hello World示例以获取 Input Object

    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
    
        "github.com/graphql-go/graphql"
    )
    
    func main() {
        // Schema
    
        var inputType = graphql.NewInputObject(
            graphql.InputObjectConfig{
                Name: "MyInputType",
                Fields: graphql.InputObjectConfigFieldMap{
                    "key": &graphql.InputObjectFieldConfig{
                        Type: graphql.String,
                    },
                },
            },
        )
    
        args := graphql.FieldConfigArgument{
            "foo": &graphql.ArgumentConfig{
                Type: inputType,
            },
        }
    
        fields := graphql.Fields{
            "hello": &graphql.Field{
                Type: graphql.String,
                Args: args,
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    fmt.Println(p.Args)
                    return "world", nil
                },
            },
        }
        rootQuery := graphql.ObjectConfig{
            Name:   "RootQuery",
            Fields: fields,
        }
    
        schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
        schema, err := graphql.NewSchema(schemaConfig)
        if err != nil {
            log.Fatalf("failed to create new schema, error: %v", err)
        }
    
        // Query
        query := `
            {
                hello(foo:{key:"blah"})
            }
        `
        params := graphql.Params{Schema: schema, RequestString: query}
        r := graphql.Do(params)
        if len(r.Errors) > 0 {
            log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
        }
        rJSON, _ := json.Marshal(r)
        fmt.Printf("%s \n", rJSON) // {“data”:{“hello”:”world”}}
    }
    

相关问题