Reputation: 763
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
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