提问者:小点点

当Apollo服务器处于生产模式时,如何在graphql-codegen的帮助下为React生成Graphql类型?


当后端模式设置为node_env:development时,所有工作都很正常,但在生产模式下,graphql-codegen失败,出现错误:

本地Web服务器错误:

Apollo服务器不允许GraphQL内省,但查询包含_schema或_type。若要启用内省,请将内省:true传递给生产中的ApolloServer

生产Web服务器错误:

无法从https://example.com/graphql加载架构,原因:无法验证第一个证书。GraphQL代码生成器支持:

  • ES模块和CommonJS导出(导出为默认值或命名的导出“架构”)
  • 内省JSON文件
  • GraphQLendpoint的URL
  • 具有类型定义(glob表达式)的多个文件
  • 配置文件中的字符串

前端codegen.yml:

schema: ${REACT_APP_GRAPHQL_URL}
documents:
 - './src/GraphQL/queries/query.ts'    
 - './src/GraphQL/mutations/mutation.ts'
overwrite: true
generates:
  ./src/generated/graphql.tsx:
    plugins:
      - typescript
      - typescript-operations
      - typescript-react-apollo
    config:
      skipTypename: false
      withHooks: true
      withHOC: false
      withComponent: false

前端DevDependencies:

{
    "@graphql-codegen/cli": "^1.20.1",
    "@graphql-codegen/typescript": "^1.20.2",
    "@graphql-codegen/typescript-operations": "^1.17.14",
    "@graphql-codegen/typescript-react-apollo": "^2.2.1",
}

npm脚本:

{
    "generate": "graphql-codegen -r dotenv/config --watch --config codegen.yml",
    "prebuild": "graphql-codegen -r dotenv/config --config codegen.yml"
}

./src/generated/directory添加到.gitignore


共1个答案

匿名用户

我的解决方案是添加内省插件并将codegen.yml文件分离到:

  • codegen-generate-schema-json和
  • codegen-generate-typescript
devDependencies: {"@graphql-codegen/introspection": "^1.18.1"}

codegen-generate-typescript.yml:

schema: graphql.schema.json
documents:
  - './src/GraphQL/queries/query.ts'
  - './src/GraphQL/mutations/mutation.ts'
overwrite: true
generates:
  ./src/generated/graphql.tsx:
    plugins:
      - typescript
      - typescript-operations
      - typescript-react-apollo
    config:
      skipTypename: false
      withHooks: true
      withHOC: false
      withComponent: false

codegen-generate-schema-json.yml:

schema: ${REACT_APP_GRAPHQL_URL}
overwrite: true
generates:
  ./graphql.schema.json:
    plugins:
      - introspection

因此需要提交./graphql.schema.json文件并将其用作模式源而不是URI。

也许你会提出更好的解决方案?