2017-07-07 258 views
3

我想我的第一个GraphQL方法。下面是代码:GraphQL:Query.type字段类型必须是输出类型,但得到:undefined

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

然后在我的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 
})); 

我得到以下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) 

帮助thanksited。

回答

2

内,您的查询类型定义,你写道:

fields: Companies 

应该

fields: { Companies } 

望着docs,场需要一个对象或返回一个对象的功能,与该对象的关键点映射到类型中所有字段的名称(本例中为模式中的所有查询)。

此外,为了清楚,因为查询和突变是其各自类型的字段,它可能是更好的给它们命名首字母大写,而不是PascalCase(即{公司:公司}

相关问题