GraphQL: Field type Query.type should be Output type but received: undefined

I am trying my first approach to GraphQL. Here is the code:

schema.js:

import {
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLInputObjectType,
    GraphQLNonNull,
    GraphQLString,
    GraphQLBoolean,
    GraphQLInt,
    GraphQLID,
    GraphQLList
} from 'graphql';

import Company from '../../models/Company';

const CompanyType = new GraphQLObjectType({
    name: 'Company',
    description: 'Company',
    fields: {
        _id: {
            type: new GraphQLNonNull(GraphQLID)
        },
        name: {
            type: GraphQLString
        }
    }
})


const Companies = {
    type: CompanyType,
    args: {
        id: {
            name: 'ID',
            type: new GraphQLNonNull(GraphQLID)
        }
    },
    resolve(root, params) {
        return Company.find(params.id).exec();
    }
}


export default new GraphQLSchema({

    query: new GraphQLObjectType({
        name: 'Query',
        fields: Companies
    })
});

      

Then in my server.js :

import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import morgan from 'morgan';
import graphqlHTTP from 'express-graphql';

import schema from './schema';

mongoose.Promise = global.Promise;

// set up example server
const app = express();
app.set('port', (process.env.API_PORT || 3001));


 // logger
 app.use(morgan('dev')); 

// parse body
app.use(bodyParser.json());

// redirect all requests to /graphql
app.use(function redirect(req, res) {
  res.redirect('/graphql');
});


app.use('/graphql', graphqlHTTP({
  schema: schema,
  graphqli: true,
  pretty: true
}));

      

I am getting the following error:

D:\test\node_modules\graphql\jsutils\invariant.js:19
    throw new Error(message);
    ^

Error: Query.type field type must be Output Type but got: undefined.
    at invariant (D:\test\node_modules\graphql\jsutils\invariant.js:19:11)
    at D:\test\node_modules\graphql\type\definition.js:361:29
    at Array.forEach (native)
    at defineFieldMap (D:\test\node_modules\graphql\type\definition.js:352:14)
    at GraphQLObjectType.getFields (D:\test\node_modules\graphql\type\definition.js:306:44)
    at typeMapReducer (D:\test\node_modules\graphql\type\schema.js:206:25)
    at Array.reduce (native)
    at new GraphQLSchema (D:\test\node_modules\graphql\type\schema.js:95:34)
    at Object.<anonymous> (D:/9. DEV/WORKSPACE/mom/client/graphql/index.js:62:16)
    at Module._compile (module.js:570:32)
    at loader (D:\test\node_modules\babel-register\lib\node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (D:\test\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)

      

Help is appreciated.

+5


source to share


2 answers


Inside the request type definition, you wrote:

fields: Companies

      

It should be



fields: { Companies }

      

Looking at the docs , fields take an object or a function that returns an object, with those object keys being mapped to the names of all the fields in the type (all queries in your schema in this case).

Also, for clarity, since queries and mutations are fields of their respective types, it is better to name them in camelCase rather than PascalCase (i.e. {company: Companies}

+3


source


inside your schema.js when creating object type for string as

 fields: {
              name: {type: String} 
    }

      



the same is needed for your custom fields, so

fields: {Companies}

      

0


source







All Articles