2017-04-12 39 views
0

我有這個GraphQL類型:解決在GraphQL列表字段沒有結構

type User { 
    id: String 
    name: String 
} 

通過

var UserObject = graphql.NewObject(graphql.ObjectConfig{ 
    Name: "User", 
    Fields: graphql.Fields{ 
     "id": &graphql.Field{ 
      Type: graphql.String, 
     }, 
     "name": &graphql.Field{ 
      Type: graphql.String, 
     }, 
    }, 
}) 

定義在我的根查詢,我想一些用戶查詢字段users鏈接:

var RootQuery = graphql.NewObject(graphql.ObjectConfig{ 
    Name: "RootQuery", 
    Fields: graphql.Fields{ 
     "users": &graphql.Field{ 
      Type: graphql.NewList(UserObject), 
      Resolve: func(p graphql.ResolveParams) (interface{}, error) { 
       return Users{ 
        User{ 
         ID: "1", 
         NAME: "John", 
        }, 
        User{ 
         ID: "2", 
         NAME: "Jess" 
        } 
       }, nil 
      }, 
     }, 
    }, 
}) 

type User struct { 
    ID string 
    NAME string 
} 

type Users []User 

正如你看到的,我有一個UserUsers數據類型。到現在爲止還挺好。

現在,想象一下,我無法創建UserUsers結構,那麼我可以在Resolve函數中返回什麼而不是它們呢?

我想過一個[]map[string]string。它會是這樣的:

var RootQuery = graphql.NewObject(graphql.ObjectConfig{ 
     Name: "RootQuery", 
     Fields: graphql.Fields{ 
      "users": &graphql.Field{ 
       Type: graphql.NewList(UserObject), 
       Resolve: func(p graphql.ResolveParams) (interface{}, error) { 
        users := []map[string]string { 
         map[string]string { 
          "id" : "1", 
          "name" : "John", 
         }, 
         map[string]string { 
          "id" : "2", 
          "name" : "Jess", 
         }, 
        } 
        return users, nil 
       }, 
      }, 
     }, 
    }) 

但它不起作用。每個屬性在查詢結果中爲nil。有沒有辦法解決這個問題?請記住,我無法創建User結構。這必須是「通用的」。

+0

你可以提供你傳遞給'graphql.NewList'的'UserObject'的定義嗎? – mkopriva

+0

完成。這是類型的定義用戶 –

回答

2

您可以使用map[string]interface{}而不是map[string]string,它應該可以工作。這是爲什麼?我真的不知道,我找不到任何可接受的文檔,作爲FieldResolveFn的返回值。

users := []map[string]interface{}{{ 
    "id": "1", 
    "name": "John", 
}, { 
    "id": "2", 
    "name": "Jess", 
}} 
return users, nil 
+0

偉大的,它的工作原理!謝謝:DDD –

+0

我很高興我能幫忙;)。 – mkopriva