Разрешение списка полей в 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
Как видите, у меня есть User
а также Users
типы данных. Все идет нормально.
Теперь представьте, что я не могу создать User
ни Users
структуры, что я мог бы вернуть в 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
структура. Это должно быть "универсальным".
1 ответ
Ты можешь использовать map[string]interface{}
вместо map[string]string
и это должно работать. Почему это? Я действительно не знаю, я не мог найти никаких документов относительно того, что является приемлемым в качестве возвращаемого значения от FieldResolveFn
,
users := []map[string]interface{}{{
"id": "1",
"name": "John",
}, {
"id": "2",
"name": "Jess",
}}
return users, nil