Разрешение списка полей в 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
Другие вопросы по тегам