Apollo graphql:makeExecutableSchema 和游乐场
Posted
技术标签:
【中文标题】Apollo graphql:makeExecutableSchema 和游乐场【英文标题】:Apollo graphql: makeExecutableSchema & playground 【发布时间】:2020-01-05 13:02:06 【问题描述】:我是一个尝试使用 apollo-express 和 prisma 设置 graphql API 的初学者
一切进展顺利,但我决定使用这个库来添加输入验证: graphql-constraint-directive
它需要我使用 makeExecutableSchema 来构建我的架构,以便我可以使用 schemaDirectives 参数
我启动服务器的代码是这样的:
const server = new ApolloServer(
typeDefs,
resolvers,
context: (req) =>
const userId = getUserID(req);
return
userId,
prisma
);
一切运行良好
但为了使用该库,我将其重构如下:
const schema = makeExecutableSchema(
typeDefs,
resolvers,
schemaDirectives: constraint: ConstraintDirective
);
const server = new ApolloServer(
schema,
context: (req) =>
const userId = getUserID(req);
return
userId,
prisma
);
它也有效,我所有的查询和突变都有效,验证也有效。
但它破坏了 graphql-playground:它不再能够加载我的架构和文档,两个选项卡都是空的。它显示以下错误: 无法访问服务器
它仍然有效:我能够发送我的查询和突变等等,但我不再有代码完成和自动文档,因为它不知道我的架构,因此不再有用
如果我替换纯 typeDefs 和解析器的可执行模式,那么它会再次正常工作,playground 会再次加载所有内容
在使用 makeExecutableSchema 时我应该做一些不同的事情来让 playgroun 工作吗?
【问题讨论】:
【参考方案1】:无论您是使用makeExecutableSchema
还是将typeDefs
和resolvers
直接传递给ApolloServer
构造函数都无关紧要——Apollo Server 无论如何都在底层使用makeExecutableSchema
。实际上,您可以直接将指令映射传递给构造函数:
const server = new ApolloServer(
typeDefs,
resolvers,
schemaDirectives: constraint: ConstraintDirective
context: (req) =>
const userId = getUserID(req);
return
userId,
prisma
);
这是您正在使用的库的错误。该指令将内置标量替换为自定义标量,但实际上并未将这些自定义标量添加到模式中。当 Playground 尝试自省模式时,它无法在自省结果中找到自定义标量并输出错误。我会避免使用那个特定的库——它看起来没有得到积极维护。
【讨论】:
以上是关于Apollo graphql:makeExecutableSchema 和游乐场的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL / Apollo - 无法获取 NetworkError
GraphQL - 如何捕获“内部”Apollo/GraphQL 错误 - Java Spring Boot