graphql-go:使用对象作为查询的输入参数 [英] graphql-go : Use an Object as Input Argument to a Query

查看:101
本文介绍了graphql-go:使用对象作为查询的输入参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将对象作为参数传递给查询(而不是标量).从文档看来,这应该是可能的,但是我不知道如何使它起作用.

I'm attempting to pass an object as an argument to a query (rather than a scalar). From the docs it seems that this should be possible, but I can't figure out how to make it work.

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

I'm using graphql-go, here is the test schema:

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和标准Object)

And the inputtype I'm attempting to use (I've tried both an InputObject and a standard Object)

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

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

And here is the graphql query I'm using to test:

{
        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.]

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

The thing is, when I change the type to a string, it works fine. How do I use an object as an input arg?

谢谢!

推荐答案

出现了同样的问题.这是我通过graphql-go源码发现的.

Had the same issue. Here is what I found from going through the graphql-go source.

InputObject Fields 必须具有 InputObjectConfigFieldMap InputObjectConfigFieldMapThunk 类型,才能使pkg起作用.

The Fields of an InputObject have to be of type InputObjectConfigFieldMap or InputObjectConfigFieldMapThunk for the pkg to work.

所以 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"}}
}

这篇关于graphql-go:使用对象作为查询的输入参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆