使用 `openapi-to-graphql` 构建的 TypeDef 在 Fastify 中公开 GraphQL 的问题

Issue Exposing GraphQL In Fastify With TypeDefs Built With `openapi-to-graphql`

我有一个工作的 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,并且查询 window 中的 Intellisense/AutoComplete 功能似乎有效 - 它标记了语法错误,列出了我的操作和属性等。但是,每当我执行命令时,我最终都会得到类似于以下内容的空结果:

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

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

作为完整性检查,我将我的一个操作的基本解析器硬编码为始终 return true,并且 did 在 GraphQL Playground 中工作,所以我 认为 除了 GraphQL 到 REST 的连接外,其余设置都很好。

如有任何见解,我们将不胜感激。

您提供了类型定义,但没有解析器。解析器实际上是在指导您的模式如何解析各个字段。您正在使用的包不是适合您要执行的操作的工具。相反,您可以使用 openapi-to-graphql,它允许您创建可执行模式:

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

您可能还想看看 GraphQL Mesh