0

当我使用构建架构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"
                },
                // ...
            ]
        }
    }
}

我将使用 graphql 和Elm-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();

类型.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;
}

解析器.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到对象类型,如下所示

 @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',
...

我该如何解决?

因为我英语不好,所以我担心如果有错误的事情。请让我知道并纠正。谢谢。

4

2 回答 2

0

看起来你已经打开了包缩小,所以所有的类名都被弄乱了。

于 2021-02-28T12:46:59.323 回答
0

我们在生产中运行时使用 SST 和 TypeGraphQL 看到了这一点。ObjectType() 和 InputType() 类的“__typename”属性正在转换为两个字母代码。见照片。

Michał,您能否详细说明 TypeGraphQL 中的 bundle minification 以及如何配置它以维护源代码 ObjectType() 和 InputType() 声明的类名?

"@serverless-stack/cli": "0.54.4",
"@serverless-stack/resources": "0.54.4",    
"apollo-server-lambda": "^2.21.1",
"type-graphql": "^1.1.1",

const server = new ApolloServer({
  schema: buildSchemaSync({
    resolvers: [getWebPaths],
    scalarsMap: [],
    validate: false,
  }),

  playground: true, //IS_LOCAL,
  introspection: true, // IS_LOCAL,

  context: async ({
    context,
    event,
  }: {
    event: APIGatewayEvent
    context: Context
  }): Promise<LambdaRoot> => {
    context.callbackWaitsForEmptyEventLoop = false

    return {
      event,
      context,
    }
  },
})
于 2022-02-21T02:03:40.000 回答