sameer manek
sameer manek

Reputation: 763

GraphQL error: Expected GraphQL named type but got: {}

I have 2 custom graphql types, entityType and containerType, where 1 container can have multiple entities.

So, I am binding all the entities with their respective containers via this code:

const graphql = require('graphql')
const _ = require('lodash')

const UserType = require('./userSchema')
const ContainerType = require('./containerSchema')

const Container = require('../models/container')
const Entity = require('../models/entity')
const {
    GraphQLObjectType, 
    GraphQLString,
    GraphQLBoolean,
    GraphQLSchema,
    GraphQLInt,
    GraphQLID,
    GraphQLList,
    GraphQLNonNull,
    GraphQLUnionType
} = graphql

const EntityType = new GraphQLObjectType({
    name: "Entity",
    fields: () => ({
        name: { type: new GraphQLNonNull(GraphQLString) },
        container: { 
            type: ContainerType,
            resolve: function(parent, args) {
                return Container.findById(parent.containerId)
            } 
        },
        type: { type: new GraphQLNonNull(GraphQLString) },
        detail: { type: new GraphQLNonNull(GraphQLString) },
        start: { type: GraphQLString },
        end: { type: GraphQLString }
    })
})
module.exports = { EntityType }

I am quite sure that containerType is working, because I am using it is being used on other places and is working well. Here is the code for Container type:

const graphql = require('graphql')
const _ = require('lodash')

const UserType = require('./userSchema')
const { EntityType } = require('./entitySchema')

const User = require('../models/user')
const Container = require('../models/container')
const Entity = require('../models/entity')

const { 
    GraphQLObjectType, 
    GraphQLString,
    GraphQLBoolean,
    GraphQLSchema,
    GraphQLInt,
    GraphQLID,
    GraphQLList,
    GraphQLNonNull
} = graphql

const ContainerType = new GraphQLObjectType ({
    name: 'Container',
    fields: () => ({
        id: { type: GraphQLID },
        name: { type: GraphQLString },
        user: { 
            type: UserType,
            resolve: function (parent, args) {
                return User.findById(parent.userId)
            }
        },
        parent: {
            type: ContainerType,
            resolve: function (parent, args) {
                return Container.findById(parent.parentContainer)
            }
        },
        detail: { type: GraphQLString },
        start: { type: GraphQLString },
        end: { type: GraphQLString },
        createdAt: { type: GraphQLString },
        category: { type: GraphQLString },
        status: { type: GraphQLString },
        entities: {
            type: GraphQLList(EntityType),
            resolve: async function(parent, args) {
                return await Entity.find({ containerId: parent.id })
            }
        }
    })
})



module.exports = ContainerType

no error is shown on the terminal, but the Graphiql console shows following error when loading up:

{
  "errors": [
    {
      "message": "The type of Entity.container must be Output Type but got: {}."
    },
    {
      "message": "Expected GraphQL named type but got: {}."
    }
  ]
}

Upvotes: 2

Views: 1311

Answers (1)

sameer manek
sameer manek

Reputation: 763

I figured out that the problem was with something called "module cycles". this post was very helpful to resolve it.

Finally, I ended up adding both EntitySchema and ContainerSchema in a single file, here is the code:

const graphql = require('graphql')
const _ = require('lodash')

const UserType = require('./userSchema')

const User = require('../models/user')
const Container = require('../models/container')
const Entity = require('../models/entity')

const { 
    GraphQLObjectType, 
    GraphQLString,
    GraphQLBoolean,
    GraphQLInt,
    GraphQLID,
    GraphQLList,
    GraphQLNonNull
} = graphql

const EntityType = new GraphQLObjectType ({
    name: "Entity",
    fields: () => ({
        name: { type: new GraphQLNonNull(GraphQLString) },
        container: { 
            type: ContainerType,
            resolve: (parent, args) => {
                return Container.findById(parent.containerId)
            }
        },
        type: { type: new GraphQLNonNull(GraphQLString) },
        detail: { type: new GraphQLNonNull(GraphQLString) },
        start: { type: GraphQLString },
        end: { type: GraphQLString }
    })
})

const ContainerType = new GraphQLObjectType ({
    name: 'Container',
    fields: () => ({
        id: { type: GraphQLID },
        name: { type: GraphQLString },
        user: { 
            type: UserType,
            resolve: function (parent, args) {
                return User.findById(parent.userId)
            }
        },
        parent: {
            type: ContainerType,
            resolve: function (parent, args) {
                return Container.findById(parent.parentContainer)
            }
        },
        detail: { type: GraphQLString },
        start: { type: GraphQLString },
        end: { type: GraphQLString },
        createdAt: { type: GraphQLString },
        category: { type: GraphQLString },
        status: { type: GraphQLString },
        entities: {
            type: GraphQLList(EntityType),
            resolve: async function(parent, args) {
                return await Entity.find({ containerId: parent.id })
            }
        }
    })
})

module.exports = {
    EntityType, 
    ContainerType
}

Upvotes: 4

Related Questions