【问题标题】:Issue Exposing GraphQL In Fastify With TypeDefs Built With `openapi-to-graphql`使用 `openapi-to-graphql` 构建的 TypeDef 在 Fastify 中暴露 GraphQL 的问题
【发布时间】:2021-03-02 10:41:43
【问题描述】:

我有一个工作的 Fastify REST 服务器,它公开了一个符合标准的 OpenAPI 合约,我希望通过 Apollo 额外添加 GraphQL 支持。

https://www.npmjs.com/package/apollo-server-fastify

我完成了上述模块的设置说明,一切看起来都很简单,直到需要定义连接点所需的 TypeDef 和 Resolver 信息。不想手动重新发明映射,我决定利用以下包:

https://www.npmjs.com/package/openapi-to-graphql-cli

具体来说,我运行了以下命令:

openapi-to-graphql spec-2.0.json --operationIdFieldNames --save spec.graphql

运行时没有任何抱怨,并吐出在我看来是我的 API 的完整 TypeDef 集。希望这就是所有需要的,我把它连接起来:

  const apolloServer = new ApolloServer({
    typeDefs: gql`${fs.readFileSync('spec.graphql', 'utf-8')}`,
    tracing: true,
    playground: true
  })
  fastifyInstance.register(apolloServer.createHandler())

当我导航到新的 /graphql 端点时,GraphQL Playground 呈现,并且查询窗口中的 Intellisense/AutoComplete 功能似乎工作 - 它标记了语法错误,列出了我的操作和属性等。但是,任何时候我执行一个命令,我最终得到一个类似于以下的空结果:

{
  "data": {
    "operationNameGoesHere": null
  }
}

我很茫然。显然有些东西没有正确连接将 GraphQL 查询连接到 REST 端点的默认解析器,但我不知道如何排除故障。

作为健全性检查,我为我的一个操作硬编码了一个基本解析器以始终返回 true,并且 确实 在 GraphQL Playground 中工作,所以我认为除了 GraphQL 到 REST 的连接之外,其余的设置都很好。

感谢任何见解。

【问题讨论】:

    标签: graphql apollo openapi fastify


    【解决方案1】:

    您提供了类型定义,但没有提供解析器。解析器实际上指示您的架构如何解析各个字段。您正在使用的包不是适合您尝试做的事情的工具。相反,您可以使用openapi-to-graphql,它允许您创建可执行架构:

    const { schema } = await createGraphQLSchema(oas)
    const apolloServer = new ApolloServer({
      schema,
    })
    

    您可能还想看看GraphQL Mesh

    【讨论】:

    • 谢谢,我想我(错误地)假设默认解析器会启动并神奇地连接点。这是我第一次涉足 GraphQL,所以我从零基础知识开始。 createGraphQLSchema 和显式设置 baseUrl 值的组合(由于在 WSL2 下运行它似乎将 localhost 代理到不同的端口)似乎已经成功了。非常感谢!
    猜你喜欢
    • 2020-11-14
    • 2021-12-19
    • 2019-12-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2020-12-02
    • 2018-06-06
    • 2020-12-29
    相关资源
    最近更新 更多