【问题标题】:`__typename` returned by the server isn't match to graphql schema服务器返回的 `__typename` 与 graphql 模式不匹配
【发布时间】:2021-05-23 17:45:19
【问题描述】:

当我使用type-graphql 构建架构并使用apollo-server-lambda 创建服务器并将其部署到netlify functions 时,发生了错误。

type-graphql 生成的模式

# -----------------------------------------------
# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!
# !!!   DO NOT MODIFY THIS FILE BY YOURSELF   !!!
# -----------------------------------------------

type Project {
  name: String!
  summary: String!
  titleAndSummary: String!
}

type Query {
  projects: [Project!]!
}

问题

我认为当我查询 API 时

{
  __schema {
    types {
      name
    }
  }
}

API 必须像这样响应

{
    "data": {
        "__schema": {
            "types": [
                {
                    "name": "Query"
                },
                {
                    "name": "Project"
                },
                // ...
            ]
        }
    }
}

但我得到了

{
    "data": {
        "__schema": {
            "types": [
                {
                    "name": "Query"
                },
                {
                    "name": "a"
                },
                // ...
            ]
        }
    }
}

我将使用带有Elm-Graphql 的graphql 使用它们的__typename 属性自动生成模块。这就是为什么我必须解决上述问题。

我努力解决它,但甚至找不到问题出在哪里。似乎在type-graphqlapollo-server 甚至netlify functions 中(我尝试了netlify 开发服务器和实际部署的真实服务器)

代码

graphql.ts

import 'reflect-metadata';
import { ApolloServer } from 'apollo-server-lambda';
import { buildSchemaSync } from 'type-graphql';
import { QueryResolver, ProjectResolver } from './resolver';

const schema = buildSchemaSync({
  resolvers: [QueryResolver, ProjectResolver],
});

const server = new ApolloServer({
  schema,
  debug: false,
});

export const handler = server.createHandler();

types.ts

import { ObjectType, Field } from 'type-graphql';

@ObjectType()
export class Query {
  @Field((type) => [Project!]!)
  projects!: Project[];
}

@ObjectType()
export class Project {
  @Field((type) => String!)
  name!: string;

  @Field((type) => String!)
  summary!: string;
}

resolver.ts

import { Resolver, Query, FieldResolver, Root } from 'type-graphql';
import { Project } from './types';
import { projectList } from '../../db/fakeDB';

@Resolver()
export class QueryResolver {
  @Query((returns) => [Project])
  projects() {
    return projectList;
  }
}

@Resolver((of) => Project)
export class ProjectResolver {
  @FieldResolver((returns) => String!)
  titleAndSummary(@Root() project: Project) {
    return project.name + ' ++ ' + project.summary;
  }
}

试用

像下面这样直接将__typename添加到Objec Type

 @Resolver((of) => Project)
export class ProjectResolver {
  @FieldResolver((returns) => String!)
  titleAndSummary(@Root() project: Project) {
    return project.name + ' ++ ' + project.summary;
  }

  @FieldResolver((returns) => String!)
  __typename() {
    return 'Project';
  }
}

但它会在请求中引发错误

◈ Error during invocation:  {
  errorMessage: 'Name "__typename" must not begin with "__", which is reserved by GraphQL introspection.',
  errorType: 'Error',
...

我该如何解决?

因为我英语不好,所以我担心如果有不对的地方。请让我知道并纠正。谢谢。

【问题讨论】:

    标签: typescript graphql apollo-server typegraphql netlify-function


    【解决方案1】:

    看起来你已经打开了压缩包,所以所有的类名都被破坏了。

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2012-11-14
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多