Hay dos objetos, Usuarios y Empresa, cada usuario trabaja para una empresa, por lo que tiene un identificador de empresa al que se hace referencia a través de GraphQL. Del mismo modo, cada Empresa tiene una lista de usuarios que trabajan para ellos.
Aquí está el código:
empresa.js
const UserType = require('./user') const CompanyType = new GraphQLObjectType({ name: 'Company', fields: () => ({ id: { type: GraphQLString }, name: { type: GraphQLString }, users: { type: new GraphQLList(UserType), --------> Error:Expected {} to be a GraphQL type. Expected UserType to be a GraphQL type. async resolve(parentValue, args) { return await axios( `http://localhost:3001/company/${parentValue.id}/users` ).then(({ data }) => data) }, }, }), })usuario.js
const CompanyType = require('./company') const UserType = new GraphQLObjectType({ name: 'User', fields: () => ({ id: { type: GraphQLString }, age: { type: GraphQLInt }, name: { type: GraphQLString }, company: { type: CompanyType, async resolve(parentValue, args) { console.log(parentValue) return await axios( `http://www.localhost:3001/company/${parentValue.companyId}` ).then((response) => response.data) }, }, }), })rootquery.js
const UserType = require('./user') const CompanyType = require('./company') const RootQuery = new GraphQLObjectType({ name: 'RootQueryObjectType', fields: { user: { type: UserType, args: { id: { type: GraphQLString }, }, resolve: async (parentValue, args) => { return await axios(`http://localhost:3001/users/${args.id}`).then( ({ data }) => data ) }, }, company: { type: CompanyType, args: { id: { type: GraphQLString }, }, resolve: async (parentValue, args) => { return await axios(`http://localhost:3001/company/${args.id}`).then( ({ data }) => data ) }, }, }, })El error es comprensible debido a las dependencias circulares. En caso de que coloque el código de user.js y company.js en rootquery.js, no hay ningún error. ¿Hay alguna manera de separar estos archivos sin encontrar un error de objeto vacío?
Después de investigar un poco, descubrí que siempre que necesite usar una dependencia circular, debe requerirla en ese punto de su código, en lugar de requerirla como una variable. P.ej
Previamente:
const UserType = require('./user') ---> This was null/empty as it wasn't yet created const CompanyType = new GraphQLObjectType({ name: 'Company', fields: () => ({ id: { type: GraphQLString }, name: { type: GraphQLString }, users: { type: new GraphQLList(UserType), --------> Error:Expected {} to be a GraphQL type. Expected UserType to be a GraphQL type. async resolve(parentValue, args) { return await axios( `http://localhost:3001/company/${parentValue.id}/users` ).then(({ data }) => data) }, }, }), })Para superar este problema, necesité el módulo necesario exactamente donde se requiere
Solución:
const UserType = new GraphQLObjectType({ name: 'User', fields: () => ({ name: { type: GraphQLString }, id: { type: GraphQLString }, age: { type: GraphQLInt }, company: { **type: require('./company'),** -----> This is where a dynamic import is being made async resolve(parentValue, args) { return await axios( `http://localhost:3001/users/${parentValue.id}` ).then(({ data }) => data) }, }, }), })