使用 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
并删除该文件中的所有评论,错误应该消失。
每次都在同一行出现 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
并删除该文件中的所有评论,错误应该消失。