GraphQL Expected Iterable, but did not find one for field xxx.yyy

GraphQL Expected Iterable, but did not find one for field xxx.yyy

93

I’m currently trying GraphQL with NodeJS and I don’t know, why this error occurs with the following query:

{
  library{
    name,
    user {
      name
      email
    }
  }
}

I am not sure if the type of my resolveLibrary is right, because at any example I had a look at they used new GraphQL.GraphQLList(), but in my case I really want to return a single user object, not an array of users.

My code:

const GraphQL = require('graphql');
const DB = require('../database/db');
const user = require('./user').type;

const library = new GraphQL.GraphQLObjectType({
    name: 'library',
    description: `This represents a user's library`,
    fields: () => {
        return {
            name: {
                type: GraphQL.GraphQLString,
                resolve(library) {
                    return library.name;
                }
            },
            user: {
                type: user,
                resolve(library) {
                    console.log(library.user);
                    return library.user
                }
            }
        }
    }
});

const resolveLibrary = {
    type: library,
    resolve(root) {
        return {
            name: 'My fancy library',
            user: {
                name: 'User name',
                email: {
                    email: '[email protected]'
                }
           }
        }
    }
}

module.exports = resolveLibrary;

Error:

Error: Expected Iterable, but did not find one for field library.user.

So my library schema provides a user field which returns the right data (the console.log is called).

Share
Improve this question

3

  • 1

    It sounds like possibly a problem with the user type you are importing. Can you update your question to include the code for user.js?

    – Daniel Rearden

    Oct 1, 2017 at 16:54

  • Thank you very much, you were right, the export of my user.js was wrong…

    – Vetterjack

    Oct 1, 2017 at 19:12

  • Show in an edit your solution please?

    – Jacob

    Jan 1, 2019 at 0:35

10 Answers
10

Reset to default

154

I ran into this problem as well. It appears that what you’re returning from your resolver doesn’t match the return type in your schema.

Specifically for the error message Expected Iterable, but did not find one for field library.user., your schema expects an array(Iterable) but you aren’t returning an array in your resolver

I had this in my schema.js:

login(email: String, password: String): [SuccessfulLogin]

I changed that to:

login(email: String, password: String): SuccessfulLogin

Notice the square brackets around “SuccessfulLogin”. It’s up to you whether you want to update the resolver return type or update the schema’s expectations

Share
Improve this answer

8

  • 1

    Hi @vineeth, thanks for the update, i have one more thing to ask, what is the square brackets for? seems fine without them

    – Seeliang

    Jul 23, 2018 at 22:37

  • 2

    @Liang Square brackets signifies that you should be expecting an iterable object or an array in the JSON response. Apologies for late response

    – Vineeth Pradhan

    Aug 19, 2018 at 5:53

  • 3

    thanks and no worries. i think i got it now,[] means it shall return array, without, shall return object

    – Seeliang

    Aug 21, 2018 at 9:39


  • 1

    Dang, I changed it for something and forgot to change it back lmao. Thanks.

    – Jacob

    Jan 1, 2019 at 0:33

  • 2

    I feel guilty when reading this. Thank you for taking time to post this answer.

    – Sang Dang

    Feb 28, 2020 at 8:47

10

I guess your user is an instance of GraphQLList that is why the field user is expecting to resolve to an iterable object.

Share
Improve this answer

0

    6

    I had the same problem. I was using find instead filter.

    Share
    Improve this answer

      5

      I ran into the same issue but i was using GraphQL with Go.

      Solution:
      I mentioned the return type to be a list( or you can say an array), but my resolver function was returning an interface and not a list of interfaces.

      Before it was =>

      Type: graphql.NewList(graphqll.UniversalType)
      

      Later i changed it to =>

      Type: graphqll.UniversalType
      

      graphqll.UniversalType : ‘graphqll’ is the name of my user-defined package and ‘UniversalType’ is the GraphQL object i have created.

      The previous structure of graphql object was :

      var GetAllEmpDet = &graphql.Field{
          Type: graphql.NewList(graphqll.UniversalType),
          Resolve: func(params graphql.ResolveParams) (interface{}, error) {
             ...
             ...
             // Your resolver code goes here, how you handle.
             ...
             return models.Universal, nil // models.Universal is struct and not list of struct so it gave that error.
          },
      }
      

      It worked when i changed this to:

      var GetAllEmpDet = &graphql.Field{
          Type: graphqll.UniversalType,
          Resolve: func(params graphql.ResolveParams) (interface{}, error) {
             ...
             ...
             // Your resolver code goes here, how you handle.
             ...
             return models.Universal, nil // models.Universal is struct and not list of struct so it gave that error.
          },
      }
      

      Share
      Improve this answer

        3

        It’s usually a simple mistake. Caused by declaring in the schema a List instead of a Field. The reverse will happen if you interchange. An example from Django-graphene. Switch from this:

        my_query_name = graphene.List(MyModelType, id=graphene.Int())
        

        to this:

        my_query_name = graphene.Field(MyModelType, id=graphene.Int())
        

        Share
        Improve this answer

          1

          In my case it was related to django-graphene I didn’t have a resolve method defined.

          class SomeNode(DjangoObjectType):
              things = graphene.List(ThingNode)
          
              def resolve_things(self, info, **kwargs):
                  return self.things.all()
          

          Share
          Improve this answer

            1

            For me, it was a simple fix.

             items: {
                    type: new GraphQLList(VideoType),<-- error
                    resolve(parentValue, args) {
                        const url = 'www'
            
                        return axios.get(url)
                            .then(res => res.data);
                    }
                }
            

            and change it to

             items: {
                    type: VideoType,
                    resolve(parentValue, args) {
                        const url = 'www'
            
                        return axios.get(url)
                            .then(res => res.data);
                    }
                }
            

            Share
            Improve this answer

              1

              I faced the same issue. For me, it was an issue with Mongo DB model.js file.

              GraphQL kept throwing that error because my model was saving the field as an object whereas graphQL was returning it as an array.
              The code that caused the error was this.

              tableHeaders: {
                          
                            text: {
                              type: String,
                              required: false,
                            },
                            align: {
                              type: String,
                              required: false,
                            },
                            sortable: {
                              type: Boolean,
                              required: false,
                            },
                            value: {
                              type: String,
                              required: false,
                            },
                          
                        },
              

              It was corrected to the following.

              tableHeaders: [
                          {
                            text: {
                              type: String,
                              required: false,
                            },
                            align: {
                              type: String,
                              required: false,
                            },
                            sortable: {
                              type: Boolean,
                              required: false,
                            },
                            value: {
                              type: String,
                              required: false,
                            },
                          },
                        ],
              

              Changing type from object to array fixed it.

              Share
              Improve this answer

                0

                i had the same issue i was using findOne and that seems like the issue that didnt worked. i changed to find and it worked

                    @Query(()=> [Post])
                    async getSinglePost(
                        @Arg('post_id') id: string,
                    ){
                        /*
                        const post = await getConnection().getRepository(Post).findOne({uuid:postuid})
                        console.log(post);
                        return post
                        */
                
                        const post = Post.find({uuid:id})
                        return post
                    }
                

                Share
                Improve this answer

                  0

                  This simply results due to the import error
                  earlier code

                  const books =require('./data')
                  // Resolvers define the technique for fetching the types defined in the
                  // schema. This resolver retrieves books from the "books" array above.
                  const resolvers = {
                      Query: {
                        books(){
                          return books;
                      },
                    },
                  }
                  module.exports = { resolvers };
                  

                  just replace the import statement with

                  const {books} =require('./data')
                  

                  as you had ex

                  Share
                  Improve this answer



                    Your Answer


                    Post as a guest

                    Required, but never shown


                    By clicking тАЬPost Your AnswerтАЭ, you agree to our terms of service, privacy policy and cookie policy

                    Not the answer you’re looking for? Browse other questions tagged

                    or ask your own question.

                    Leave a Reply

                    Your email address will not be published. Required fields are marked *