【发布时间】: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-graphql 或apollo-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