使用 graphql 时出现意外 <EOF>

Unexpected <EOF> while using 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
            }
            ]
        }
        ]
    }

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

例如:

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": ""}'

你会得到 意想不到的 < EOF >

此外,检查 GraphQL end of line issue

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

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

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

我在尝试拼接我的架构时遇到此错误 这个错误的原因是我声明了一个类型但没有实现它,有空体,例如:

type User {

}

实施类型修复它

看起来我们正在执行模式优先方法,但我们在您的 project/empty 中没有任何 .graphql 文件。我添加了这个,错误消失了:

src/example.graphql

type Query {
  hello: String
}

“GraphQLError:语法错误:Unexpected”错误来自 graphql 包。看起来 @nestjs/graphql 假设总是至少有一个 .graphql 文件,所以这可能是一个错误,尝试解析一个空模式而不是显示对开发人员更友好的消息或忽略它。

在大多数情况下,传递空查询是导致此错误的原因。 为避免这种情况,请在您的 graphiql

中尝试
query { 
   user {
     fields you need to retrieve
  }
}

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

"""
Some comments
"""

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

这是因为您的 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;
}

并确保解析器由模块导入并且模块添加到 App.module

这应该可以解决!

如何修复: 转到 node_mudules > graphql > syntaxError.js 并删除该文件中的所有评论,错误应该消失。