使用graphql时出现意外的<eof>

时间:2018-06-12 23:43:06

标签: graphql-js express-graphql

每次在同一行获取EOF错误,多次更改代码甚至降级到以前版本的graphql但没有正面结果。 我的代码是:

const graphql = require('graphql')
const _ = require('lodash')
 const {
     GraphQLObjectType,
     GraphQLString,
     GraphQLInt,
     GraphQLSchema
 } = graphql

const users = [
    {id: '1', firstName: 'Ansh', age: 20},
    {id: '2', firstName: 'Ram', age: 21},
    {id: '3', firstName: 'Sham', age: 20}
]

 const UserType = new GraphQLObjectType({
     name: 'User',
     fields: {
        id: {type: GraphQLString},
        firstName: {type: GraphQLString},
        age: {type: GraphQLInt}
     }
 })

 const RootQuery = new GraphQLObjectType({
     name: 'RootQueryType',
          fields: {
             user: {
                 type: UserType,
                 args: {id: {type: GraphQLString}},
                 resolve(parentValue, args) { 
                    return _.find(users, {id: args.id})
                 }
             }
         }
     })

 module.exports = new GraphQLSchema({
    query: RootQuery 
})

错误是:

    {
        "errors": [
        {
            "message": "Syntax Error GraphQL request (30:1) Unexpected <EOF>\n\n29: \n30: \n    ^\n",
            "locations": [
            {
                "line": 30,
                "column": 1
            }
            ]
        }
        ]
    }

7 个答案:

答案 0 :(得分:6)

问题是因为您传递的查询可能为空。

例如:

curl -X POST http://localhost:4000/graphql \ 
-H "Content-Type: application/json" \
-d '{"query": "{ user { id } }"}'

工作正常。

但如果你做了类似的事情:

curl -X POST http://localhost:4000/graphql \
-H "Content-Type: application/json" \
-d '{"query": ""}'

意外&lt; EOF&gt;

另外,请检查GraphQL end of line issue

答案 1 :(得分:1)

我在 schema.graphql 文件中有评论:

"""
Some comments
"""

我删除了评论,Unexpected <EOF> 错误消失了。

答案 2 :(得分:0)

这是因为没有实际查询,所以您得到意外的EOF(文件末尾)。

猜测您正在使用GraphiQL(因为EOF消息显示第30行);您需要在浏览器的GraphiQL的左侧面板上添加查询。符合您的RootQuery的事物,例如:

{
  user(id: "1") {
    id,
    firstName,
    age
  }
}

答案 3 :(得分:0)

尝试缝合架构时出现此错误 发生此错误的原因是,我委托了一个类型,但未实现它,但其主体为空,例如:

type User {

}

实现固定的类型

答案 4 :(得分:0)

看起来如果我们采用模式优先的方法,但我们的项目/空中没有任何 .graphql 文件。我添加了这个,错误消失了:

src/example.graphql

type Query {
  hello: String
}

“GraphQLError: Syntax Error: Unexpected”错误来自 graphql 包。看起来 @nestjs/graphql 假设总是至少有一个 .graphql 文件,因此这可能是尝试解析空架构与显示对开发人员更友好的消息或忽略它的错误。

答案 5 :(得分:0)

在大多数情况下,传递空查询会导致此错误。 为避免这种情况,请在您的 graphiql 中尝试此操作

query { 
   user {
     fields you need to retrieve
  }
}

答案 6 :(得分:0)

这是因为您的 graphql.gql 看起来像这样:

# ------------------------------------------------------
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
# ------------------------------------------------------

directive @key(fields: String!) on OBJECT | INTERFACE

directive @extends on OBJECT | INTERFACE

directive @external on OBJECT | FIELD_DEFINITION

directive @requires(fields: String!) on FIELD_DEFINITION

directive @provides(fields: String!) on FIELD_DEFINITION

您可以做的一件事是创建一个虚拟解析器。

// src/graphql/resolvers/user.resolver.ts

import { Resolver, Query } from '@nestjs/graphql';

import { User } from 'models/User.model';

@Resolver(() => User)
export class UserResolver {
  @Query(() => User)
  async ids() {
    return [];
  }
}

并创建一个 graphql 模型:

// src/graphql/models

import { Field, ObjectType } from '@nestjs/graphql';

@ObjectType()
export class User {
  @Field()
  createdAt: Date;
}

这应该可以解决它!