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 还是将typeDefsresolvers 直接传递给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

(Apollo) GraphQL 合并模式

具有多个 GraphQL 端点的 Apollo

GraphQL - 如何捕获“内部”Apollo/GraphQL 错误 - Java Spring Boot

GraphQL“必须提供查询字符串” graphql-tag react-apollo

GraphQL - “Federations”是普通 Graphql 的事情还是 Apollo 的事情?