You need to enable JavaScript to run this app. TypeScript应用中管理生成的GraphQL Schema的最佳实践咨询
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript应用中管理生成的GraphQL Schema的最佳实践咨询

针对Hasura+Express场景下GraphQL Schema管理方案的建议

原方案1的合规改造方向

你最初的思路是合理的,DevOps团队反对的核心原因是你把Schema拉取逻辑放在了Docker构建阶段:该阶段要求镜像构建过程可复现、不依赖任何外部运行中的服务,一旦换个无可用Hasura的构建环境,镜像就会构建失败,不符合CI/CD的通用规范,并非服务之间不能存在依赖,只是依赖放错了执行阶段。

有两种合规的改造路径:

路径1:调整CI流水线步骤

  • CI任务先启动临时Hasura容器,加载当前版本的所有元数据(表结构、权限规则、自定义逻辑等)直到完全就绪
  • 执行Schema拉取和TS类型生成脚本,将生成的文件存入Express的构建上下文
  • 执行Express的Docker构建,此时构建上下文已包含所需类型文件,无需依赖任何外部服务
  • 销毁临时Hasura容器,推进后续部署流程

路径2:将Schema拉取逻辑移到容器启动阶段

  • Docker构建阶段仅编译Express的基础代码,不涉及任何Schema相关操作
  • 容器镜像内内置轻量等待脚本,启动命令调整为:
    ./wait-for-it hasura:8080 -- node ./pull-schema-and-start.js
  • 启动时先等待Hasura服务就绪,拉取Schema生成类型文件后再启动Express服务
    该方案完全符合Docker规范,运行阶段的服务依赖是合理的,部署时本身就需要保障Hasura服务的可用性。

原方案2的可落地实现

如果暂时要采用跳过类型校验的方案,可以通过修改TS配置实现构建不失败:

  • 修改tsconfig.json,添加"noEmitOnError": false配置,即使TS抛出类型错误也会正常输出编译后的JS文件
  • 如果仅需要忽略GraphQL相关的类型报错,可以在对应查询语句上方添加// @ts-ignore单行注释,或者在GraphQL Code Generator的配置文件中添加ignoreNoDocuments: true等规则定向忽略
    该方案牺牲了类型校验的安全性,仅建议临时使用。

原方案3的优化建议

如果团队暂时保留提交Schema到Git的方案,可添加CI校验规则降低维护成本:

  • 每个PR发起时自动拉取对应版本Hasura的Schema生成文件,和PR中提交的Schema文件对比,不一致则阻断合并
  • 约定Schema文件仅由CI自动生成提交,禁止本地手动修改,可大幅降低冲突概率

内容的提问来源于stack exchange,提问作者Charklewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 06:27:04