2016-11-01 5 views
3

オブジェクトをスカラーではなくクエリの引数として渡そうとしています。ドキュメントからは、これが可能であるはずですが、私はそれを動作させる方法を理解できません。graphql-go:クエリの入力引数としてオブジェクトを使用する

私はここで、graphql-行く使っていますが、テスト・スキーマです:

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と標準オブジェクトの両方を試してみた)使用しようとしていますinputtypeここ
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.] 

タイプを文字列に変更すると、問題なく動作します。入力引数としてオブジェクトを使用するにはどうすればよいですか?

ありがとうございます!

答えて

9

同じ問題がありました。ここでは、私はgraphql-goソースを調べることから見つけたものです。

InputObjectFieldsは、pkgが動作するにはInputObjectConfigFieldMapまたはInputObjectConfigFieldMapThunkのタイプでなければなりません。

のでInputObjectは次のようになります。Input Objectを取るためのHello Worldの例変更

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

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”}} 
} 
+0

おかげで、あなたは私のために少し時間を保存! +1 –

関連する問題