Reputation: 18521
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)
Upvotes: 15
Views: 25996
Reputation: 2059
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
}
Upvotes: 2
Reputation: 652
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}
Upvotes: 1
Reputation: 84857
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 }
Upvotes: 10