【问题标题】:Apollo CodeGen can't generate TS typesApollo CodeGen 无法生成 TS 类型
【发布时间】:2019-07-30 16:44:17
【问题描述】:

我正在尝试使用 Apollo CodeGen 使用自省查询中的 json 生成一些 TS 类型。

架构文件的顶部如下所示(如果我可以提供其他信息,请告诉我)

{
  "data": {
  "__schema": {
  ...

我得到的错误是这样的

➜  continuum git:(typescript) ✗ apollo client:codegen --target typescript --localSchemaFile="./schema.json"
{ Error: Error in "Loading schema for Unnamed Project": Syntax Error: Expected Name, found }

接着是很多我无法理解的输出。这里有一点:

graphql-schema:/schema.graphql?%22%22%22Schema%20for%20types%20that%20can%20be%20active%20or%20inactive%22%22%22%0Ainterface%20ActivatedInterface%20%7B%0A%20%20%22%22%22Is%20this%20object%20enabled%3F%22%22%22%0A%20%20active%3A%20Bool!%0A%7D%0A%0A%22%22%22An%20advertisement%22%22%22%0Atype%20Ad%20implements%20CommonInterface%20%7B%0A%20%20%22%22%22Aggregate%20data%20for%20the%20campaigns%20field%22%22%22%0A%20%20_campaignStats(%0A%20%20%20%20%22%22%22Only%20live%20items%22%22%22%0A%20%20%20%20onlyLive%3A%20Bool%20%3D%20null%0A%0A%20%20%20%20%22%22%22%0A%20%20%20%20%3Cp%3EFilters%20to%20be%20applied%20to%20the%20results.%3C%2Fp%3E%0A%20%20%20%20%0A%20%20%20%20%3Cp%3EThe%20following%20%3Ccode%20class%3D%22prettyprint%22%3ECampaign%3C%2Fcode%3E%20fields%20are%20available%20for%20filtering%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cul%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ccode%20class%3D%22prettyprint%22%3EexternalId%3C%2Fcode%3E%2C%20operators%3A%0A%20%20%20%20%3Ccode%20class%3D%22prettyprint%22%3EstartsWith%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3EnotStartsWith%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3E%3D%3C%2Fcode%3E%2C%20%3Ccode%20class%3D%22prettyprint%22%3E!%3D%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3E%26lt%3B%26gt%3B%3C%2Fcode%3E%2C%20%3Ccode%20class%3D%22prettyprint%22%3E%26gt%3B%3C%2Fcode%3E%2C%0A%20%20%20%20%3Ccode%20class%3D%22prettyprint%22%3E%26gt%3B%3D%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3E%3D%26gt%3B%3C%2Fcode%3E%2C%20%3Ccode%20class%3D%22prettyprint%22%3E%26lt%3B%3C%2Fcode%3E%2C%0A%20%20%20%20%3Ccode%20class%3D%22prettyprint%22%3E%26lt%3B%3D%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3E%3D%26lt%3B%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3E%26lt%3B%3D%26gt%3B%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3EisNull%3C%2Fcode%3E%2C%20%3Ccode%0A%20%20%20%20class%3D%22prettyprint%22%3EisNotNull%3C%2Fcode%3E%3C%2Fli%3E

我的架构中缺少什么?

【问题讨论】:

  • 什么是MyAPI?您的自省结果 JSON 应该只有一个属性,那就是 data。你是如何产生这个自省结果的?
  • @DanielRearden 我最初尝试使用顶级属性为data,并且我已经编辑了我的问题,当我使用它时会发生什么。通过将此自省查询放入我的 graphql 客户端并复制生成的 json 来生成自省结果。 gist.github.com/michiel/0cf0a76fb8714f6c9727be6f64256adf

标签: apollo


【解决方案1】:

如果您遇到语法错误,可能是因为架构文件格式错误。为端点生成自省结果的最简单方法是运行以下命令:

apollo service:download --endpoint=<YOUR_ENDPOINT_URL>

这将在您的工作目录中生成一个schema.json 文件。

附带说明,为了生成类型定义,您还需要客户端查询。这是article that goes in to more detail,因为这确实超出了您最初问题的范围。您的完整命令应该看起来更像这样:

apollo codegen:generate --localSchemaFile=schema.json --target=typescript --includes=src/**/*.ts --tagName=gql --addTypename --globalTypesFile=src/types/graphql-global-types.ts types

您可以查看the docs 了解所有选项的说明。

【讨论】:

    【解决方案2】:

    这是我的脚本:

    {
        "types:generate": "apollo codegen:generate  --target=typescript --includes=src/**/*.ts --endpoint **youAPI** --header \"Authorization: Basic cHJvamVjdDpzZWV5b3V3ZWIyMDIw(replace your)\" --tagName=gql --addTypename --outputFlat src/types"
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 2020-12-21
      • 2019-11-16
      • 2019-07-19
      • 2021-09-02
      • 2021-11-16
      • 2019-02-10
      • 2019-11-12
      • 2011-09-17
      相关资源
      最近更新 更多