GraphQL: Query.type field type must be Output Type but got: undefined
Asked Answered
H

3

15

I'm trying my first GraphQL approach. 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 on 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'm getting the following errror:

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)
Hydrometeor answered 7/7, 2017 at 23:28 Comment(0)
E
10

Inside your Query type definition, you wrote:

fields: Companies

It should be

fields: { Companies }

Looking at the docs, fields takes an object or a function returning an object, with that object's keys mapping to the names of all the fields in the type (all the queries in your schema in this case).

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

Edithe answered 8/7, 2017 at 1:9 Comment(0)
C
2

For me, the problem was that I defined a graphql type and input type with the same name in my graphql schema file.

I changed this:


type InternalAttribute {
    name: String
}

input InternalAttribute {
    name: String
}

to this:

type InternalAttribute {
    name: String
}

input InternalAttributeInput {
    name: String
}
Colour answered 5/10, 2021 at 13:51 Comment(0)
V
1

inside your schema.js as you create Object Type for String as

 fields: {
              name: {type: String} 
    }

same is needed for your custom fields too therefore

fields: {Companies}
Valles answered 21/6, 2018 at 4:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.