12

我正在尝试我的第一个 GraphQL 方法。这是代码:

架构.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
}));

我收到以下错误:

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)
4

3 回答 3

8

在您的 Query 类型定义中,您写道:

fields: Companies

它应该是

fields: { Companies }

查看docs, fields 接受一个对象或一个返回对象的函数,该对象的键映射到类型中所有字段的名称(在这种情况下,您的架构中的所有查询)。

此外,为了清楚起见,由于查询和突变是它们各自类型的字段,因此最好用骆驼命名法而不是用 PascalCase 命名它们(即 { Companies: Companies }

于 2017-07-08T01:09:29.423 回答
1

在您的 schema.js 中,当您为 String 创建对象类型时

 fields: {
              name: {type: String} 
    }

因此,您的自定义字段也需要相同

fields: {Companies}
于 2018-06-21T04:27:30.507 回答
0

对我来说,问题是我在我的 graphql 模式文件中定义了同名的 graphql 类型和输入类型。

我改变了这个:


type InternalAttribute {
    name: String
}

input InternalAttribute {
    name: String
}

对此:

type InternalAttribute {
    name: String
}

input InternalAttributeInput {
    name: String
}
于 2021-10-05T13:51:16.110 回答