Поле схемы golang graphql не может вернуть массив

Я получаю эту ошибку при попытке получить массив из запроса graphql:

"User Error: expected iterable, but did not find one for field RootQuery.blogpostsBetween."

что странно, поскольку всего несколько недель назад он работал отлично, настроив мое поле следующим образом:

"blogpostsBetween": &graphql.Field{
    Type: graphql.NewList(blogpostType),
    Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                       // ... some more code ...
                      // what I return here was placed to demonstrate the error.
        return [5]Blogpost{}, err
    },
    Args: graphql.FieldConfigArgument{
        "from": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
        "to": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
    },
},

Я действительно не понимаю, почему это больше не работает, потому что, как я уже сказал, я совершенно уверен, что ничего не менял. Но я был бы счастлив ошибиться.

Обновлено: подробная информация о blogpostType

var blogpostType = graphql.NewObject(graphql.ObjectConfig{
    Name: "Blogpost",
    Fields: graphql.Fields{
        "id": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.id, nil
            },
        },
        "title": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.title, nil
            },
        },
        "body": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.body, nil
            },
        },
        "created": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.created, nil
            },
        },
        "author": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.author, nil
            },
        },
    },
})

Можете добавить детали blogpostType?

Aditya Singh 23.07.2018 21:51

отредактировал и добавил blogpostType :) @Aditya Singh

Jonas Bergner 23.07.2018 22:24

Я добавил рабочее решение на основе обновленного типа ниже.

Aditya Singh 23.07.2018 22:50
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
3
1 359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исходя из вашей проблемы, я предположил и добавил несколько типов, чтобы решение работало, как показано ниже. В этом примере запрашиваются только выбранные поля id,title,body,author

package main

import (
    "encoding/json"
    "fmt"
    "log"

    "github.com/graphql-go/graphql"
)

var blogpostType = graphql.NewObject(graphql.ObjectConfig{
    Name: "Blogpost",
    Fields: graphql.Fields{
        "id": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.id, nil
            },
        },
        "title": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.title, nil
            },
        },
        "body": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.body, nil
            },
        },
        "created": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.created, nil
            },
        },
        "author": &graphql.Field{
            Type: graphql.String,
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                m := p.Source.(Blogpost)
                return m.author, nil
            },
        },
    },
})

type Blogpost struct {
    id      string
    title   string
    body    string
    created string
    author  string
}

func main() {
    // Schema
    fields := graphql.Fields{
        "blogpostsBetween": &graphql.Field{
            Type: graphql.NewList(blogpostType),
            Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                // ... some more code ...
                // what I return here was placed to demonstrate the error.
                return []Blogpost{
                    Blogpost{
                        id:      "new-post",
                        title:   "new post",
                        body:    "Lorem ipsum",
                        author:  "John Doe",
                        created: "12.12.2012",
                    },
                }, nil
            },
            Args: graphql.FieldConfigArgument{
                "from": &graphql.ArgumentConfig{
                    Type: graphql.String,
                },
                "to": &graphql.ArgumentConfig{
                    Type: graphql.String,
                },
            },
        },
    }
    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 := `
            {
                blogpostsBetween {
                    id,
                    title,
                    body,
                    author
                }
            }
        `
    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)
}

Спасибо! Я проверю, сработает ли это для меня завтра, и дам вам знать! :)

Jonas Bergner 23.07.2018 23:22

Это сработало. Ожидается, что Graphql получит фрагмент, а не массив. Важное отличие! Вы не возражаете включить в свой ответ, что тип переменной имеет значение?

Jonas Bergner 02.08.2018 09:25

Другие вопросы по теме