2017-04-12 36 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