2017-07-07 1 views
3

J'essaie ma première approche GraphQL. Voici le code:GraphQL: Le type de champ Query.type doit être Type de sortie mais obtenu: non défini

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 
    }) 
}); 

Puis sur ma 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 
})); 

Je reçois le errror suivant:

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) 

Aide appréciée.

Répondre

2

l'intérieur de votre définition de type de requête, vous avez écrit:

fields: Companies 

Il devrait être

fields: { Companies } 

En regardant le docs, les champs prend un objet ou d'une fonction renvoyant un objet, avec les clés de cet objet mappage vers les noms de tous les champs du type (toutes les requêtes de votre schéma dans ce cas).

En outre, pour plus de clarté, puisque les requêtes et les mutations sont des champs de leurs types respectifs, il peut être préférable de les nommer en camelCase plutôt que PascalCase (à savoir {entreprises: Entreprises}