后端GraphQLAPI设计【免费下载链接】type-graphqlCreate GraphQL schema and resolvers with TypeScript, using classes and decorators!项目地址https://gitcode.com/gh_mirrors/ty/type-graphql点击查看免费下载TypeGraphQL 的核心能力是通过 TypeScript 类和装饰器直接生成 GraphQL schema而无需手写 SDL。但在很多真实场景下我们仍然需要把 schema 打印成schema.graphql旧版本为schema.gql文本文件——比如供 GraphQL 生态中的客户端工具做查询自动补全与校验、作为回归检测的快照、或者让团队成员直接阅读 SDL 来探索 API。本文以 TypeGraphQL 官方文档为基础结合仓库源码与测试用例系统讲解两种输出 schema 定义文件的完整方案buildSchema的emitSchemaFile自动生成以及emitSchemaDefinitionFile/emitSchemaDefinitionFileSync的程序化生成并深入剖析底层实现细节。为什么要输出 Schema SDL 文件TypeGraphQL 的主打特性是只用类与装饰器建 schema因此生成的 schema 对象通常只存在于运行时内存中。但以下场景需要它被持久化为 SDL 文本文件客户端工具链GraphQL 生态中的很多工具需要 SDL 文件来完成客户端查询的自动补全与校验Schema 回归检测把 SDL 文件当作快照snapshot通过 diff 感知 schema 的意外变更API 探索相比阅读复杂的 TypeGraphQL 应用代码、或在 GraphiQL / GraphQL Playground 中反复点击直接阅读 SDL 文件往往更直观高效。TypeGraphQL 为此提供了两种生成 schema 定义文件的方式下文分别展开。值得注意的是0.17.0 时代默认输出的文件名是schema.gql而当前仓库版本对应 docs/emit-schema.md中默认文件名已统一为schema.graphql下文以当前仓库行为为准。方式一通过 buildSchema 的 emitSchemaFile 选项自动生成最省事的方式是在调用buildSchema时传入emitSchemaFile选项让 TypeGraphQL 在每次构建 schema 时自动把定义写入文件。该选项支持三种形态布尔值、字符串路径、以及配置对象。const schema await buildSchema({ resolvers: [ExampleResolver], // 自动在项目工作目录下创建 schema.graphql 文件 emitSchemaFile: true, // 或者指定文件写入路径 emitSchemaFile: path.resolve(__dirname, __snapshots__/schema/schema.graphql), // 或者传入配置对象精细化控制输出 emitSchemaFile: { path: __dirname /schema.graphql, sortedSchema: false, // 默认情况下输出的 schema 会按字母序排序 }, });三种传参形态的语义从 src/utils/buildSchema.ts 的getEmitSchemaDefinitionFileOptions实现可以精确还原三种形态的处理逻辑emitSchemaFile: true使用默认路径path.resolve(process.cwd(), schema.graphql)即当前进程工作目录process.cwd()下的schema.graphqlemitSchemaFile: 路径字符串把字符串直接当作完整的目标文件路径包含文件名示例中的__snapshots__/schema/schema.graphql即属此类emitSchemaFile: { ... }配置对象对象类型为EmitSchemaFileOptions即{ path?: string } PartialPrintSchemaOptions。其中path缺省时回落为默认路径其余属性即PrintSchemaOptions的字段会与默认值做浅合并{ ...defaultPrintSchemaOptions, ...options }。PrintSchemaOptions控制 schema 输出的格式PrintSchemaOptions是控制输出格式的配置接口定义于 src/utils/emitSchemaDefinitionFile.tsexport interface PrintSchemaOptions { sortedSchema: boolean; } export const defaultPrintSchemaOptions: PrintSchemaOptions { sortedSchema: true, };sortedSchema默认true决定打印前是否对 schema 做字典序排序。排序通过graphql-js的lexicographicSortSchema实现见同文件getSchemaFileContent使类型、字段按字母序稳定排列利于生成 diff 友好的快照文件设为false则保留 schema 构建时的原始定义顺序。0.17.0 旧版文档中展示的commentDescriptions: true选项把...描述输出为#注释形式在旧版PrintSchemaOptions中存在当前仓库版本的选项接口已收敛为sortedSchema一个字段使用时以当前安装版本导出的类型为准。自动生成的文件头部警告通过emitSchemaFile或emitSchemaDefinitionFile生成的文件并非纯 SDL而是带有一段固定的生成警告头generatedSchemaWarning定义于 src/utils/emitSchemaDefinitionFile.ts# ----------------------------------------------- # !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!! # !!! DO NOT MODIFY THIS FILE BY YOURSELF !!! # -----------------------------------------------这提醒开发者该文件是构建产物、不应手工修改。测试 tests/functional/emit-schema-sdl.ts 中的checkSchemaSDL也明确断言生成内容必须包含THIS FILE WAS GENERATED字样。路径不存在时自动创建目录emitSchemaFile指向的目录不存在时TypeGraphQL 不会报错而是自动递归创建目录。其底层由 src/helpers/filesystem.ts 的outputFile/outputFileSync完成先尝试直接写文件若抛出ENOENT目录不存在则先用mkdir(dirname, { recursive: true })建目录再写入其他异常则原样向上抛出。这也解释了为何示例中__snapshots__/schema/schema.graphql这样的深层路径可以一次成功。buildSchemaSync 同步版本如果项目环境不适合异步构建例如某些启动脚本或同步初始化流程可以使用buildSchemaSync。它与buildSchema接受完全相同的BuildSchemaOptions包括emitSchemaFile的三种形态内部调用emitSchemaDefinitionFileSync同步写盘见 src/utils/buildSchema.ts。异步/同步两种 API 由emitSchemaDefinitionFile基于fs/promises与emitSchemaDefinitionFileSync基于fs分别支撑。方式二程序化调用 emitSchemaDefinitionFile 手动生成第二种方式完全绕开buildSchema在任何持有GraphQLSchema对象的地方手动调用导出函数写文件。TypeGraphQL 从 src/utils/index.ts 导出emitSchemaDefinitionFile、emitSchemaDefinitionFileSync以及PrintSchemaOptions类型、defaultPrintSchemaOptions常量。import { emitSchemaDefinitionFile } from type-graphql; // ... hypotheticalFileWatcher.watch(./src/**/*.{resolver,type,input,arg}.ts, async () { const schema getSchemaNotFromBuildSchemaFunction(); await emitSchemaDefinitionFile(/path/to/folder/schema.graphql, schema); });函数签名见 src/utils/emitSchemaDefinitionFile.tsexport function emitSchemaDefinitionFileSync( schemaFilePath: string, schema: GraphQLSchema, options: PrintSchemaOptions defaultPrintSchemaOptions, ): void; export async function emitSchemaDefinitionFile( schemaFilePath: string, schema: GraphQLSchema, options: PrintSchemaOptions defaultPrintSchemaOptions, ): Promisevoid;第一个参数为完整目标文件路径含文件名第二个参数为任意GraphQLSchema对象不要求它一定来自buildSchema上例中的getSchemaNotFromBuildSchemaFunction即示意任意来源第三个可选参数为PrintSchemaOptions省略时使用defaultPrintSchemaOptions即sortedSchema: true。典型应用场景官方文档点名的两类典型用法快照测试把该函数放进测试脚本生成 schema 快照并与预期文件比对从而在 schema 发生意外变化时让测试失败本地开发热生成结合文件监听器如上例的hypotheticalFileWatcher在.ts源文件变更时自动重新生成 SDL保持本地随时有一份最新 schema 可读。进阶让自定义指令出现在生成的 SDL 中TypeGraphQL 本身并不直接支持在输出的 schema 中携带自定义指令custom directives原因是graphql-js的printSchema函数存在限制无法打印指令定义。如果你需要自定义指令出现在生成文件中就需要自行实现一个输出函数借助第三方printSchema实现例如graphql-tools/utils提供的printSchemaWithDirectives。这一主题完整收录于当前版本文档 docs/emit-schema.md实现示例import { GraphQLSchema, lexicographicSortSchema } from graphql; import { printSchemaWithDirectives } from graphql-tools/utils; import fs from node:fs/promises; export async function emitSchemaDefinitionWithDirectivesFile( schemaFilePath: string, schema: GraphQLSchema, ): Promisevoid { const schemaFileContent printSchemaWithDirectives(lexicographicSortSchema(schema)); await fs.writeFile(schemaFilePath, schemaFileContent); }用法与标准emitSchemaDefinitionFile完全一致const schema await buildSchema(/*...*/); await emitSchemaDefinitionWithDirectivesFile(/path/to/folder/schema.graphql, schema);自定义函数可以同时复用 TypeGraphQL 的lexicographicSortSchema排序思路保持输出稳定。若无需自定义指令则优先使用内建的emitSchemaDefinitionFile即可。测试与真实项目中的用法参考仓库中的功能测试 tests/functional/emit-schema-sdl.ts 完整覆盖了上述全部行为可作为实现细节的权威佐证默认路径mockprocess.cwd()后emitSchemaFile: true会在工作目录生成schema.graphql测试第 168-177 行路径字符串emitSchemaFile: targetPath直接写入指定路径测试第 158-166 行配置对象emitSchemaFile: { path, sortedSchema: false }同时生效测试第 179-192 行传空对象{}时回落默认路径与默认排序测试第 194-205 行排序行为checkSchemaSDL断言sortedSchema: true时descriptionProperty排在normalProperty之前字母序false时保持定义顺序测试第 57-69 行错误传播写入或建目录遇到非ENOENT异常时错误会原样抛出测试第 89-113、134-154 行同步版本buildSchemaSync与emitSchemaDefinitionFileSync的行为逐项等价测试第 208-257 行。在真实项目中emitSchemaFile常与运行环境联动。例如 docs/azure-functions.md 展示了按环境变量条件开启的做法emitSchemaFile: process.env.NODE_ENV local ? path.resolve(./src/schema.graphql) : false,这样在本地开发时自动产出 schema 文件而在云端运行时关闭以免写只读文件系统。另一个例子是 docs/nestjs.md在 NestJS 集成中同样通过emitSchemaFile: true便捷生成 SDL。这两处都是自动生成方式在实际工程中的典型落地形态。小结自动生成buildSchema({ emitSchemaFile: true | 路径 | { path?, sortedSchema? } })构建 schema 的同时写盘默认输出到process.cwd()/schema.graphql默认按字典序排序并自动附带由 TypeGraphQL 生成的警告头、自动创建缺失目录同步场景可用buildSchemaSync。程序化生成emitSchemaDefinitionFile(path, schema, options?)与同步版emitSchemaDefinitionFileSync适合快照测试、文件监听热更新等需要掌控时机的场景schema 对象可来自任意来源。自定义指令内建输出基于printSchema无法打印指令定义需要自定义输出函数如借助printSchemaWithDirectives后以相同方式调用。两种方式均以 src/utils/emitSchemaDefinitionFile.ts 为统一实现核心文件写入细节封装在 src/helpers/filesystem.ts完整行为由 tests/functional/emit-schema-sdl.ts 验证可按需深入源码进一步探索。赞分享后端GraphQLAPI设计【免费下载链接】type-graphqlCreate GraphQL schema and resolvers with TypeScript, using classes and decorators!项目地址https://gitcode.com/gh_mirrors/ty/type-graphql点击查看免费下载相关推荐TypeGraphQL 输出 Schema SDL从 buildSchema 自动生成到程序化导出与自定义指令TypeGraphQL 输出 Schema SDL从 buildSchema 自动生成到程序化导出与自定义指令 TypeGraphQL 的核心特性是仅凭 Ty后端GraphQLAPI设计TypeGraphQL Schema SDL 生成指南用 buildSchema 与 emitSchemaDefinitionFile 将 GraphQL Schema 导出为文件TypeGraphQL Schema SDL 生成指南用 buildSchema 与 emitSchemaDefinitionFile 将 GraphQL S后端GraphQLAPI设计TypeGraphQL 输出 Schema SDL 文件全指南从 emitSchemaFile 到程序化导出与自定义指令TypeGraphQL 输出 Schema SDL 文件全指南从 emitSchemaFile 到程序化导出与自定义指令 导读 TypeGraphQL 的核心后端GraphQLAPI设计上一篇三分钟装好胡桃工具箱 Snap.Hutao原神抽卡保底不再手记下一篇零基础10分钟做出MapleStory MODHarepacker复活版资源编辑与地图创作完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
深圳全网营销系统避坑指南:揭秘低价建站背后的安全黑洞 深圳全网营销系统避坑指南:揭秘低价建站背后的安全黑洞 在找建站公司时,最怕的不是贵,而是被坑高价后还埋下安全地雷。很多老板拿到报价单看着便宜,上线后才发现网站动不动被挂马、数据泄露,甚至被搜索引擎降权,这时候再想补救,成本比当初直接选正规公… · 2026/9/27 11:10:51
Glass 项目贡献指南:从 Issue 认领到 PR 合并的完整协作流程与本地开发环境搭建 人工智能AI 应用交互助手本地部署语音 【免费下载链接】glass Digital Mind Extension 项目地址: https://gitcode.com/gh_mirrors/glass21/glass 点击查看 免费下载 Glass(by Pickle)是一款开源的 "Digital Mind Extension" 桌面… · 2026/9/27 11:10:51
AD9361/ADRV9009/ADRV9026射频收发器深度选型指南 1. 项目概述:为什么这三颗RFIC芯片值得被认真拆解如果你正在做无线通信系统开发、软件无线电(SDR)平台搭建,或者参与5G小基站、雷达信号处理、卫星地面站这类中高频段射频前端设计,那么AD9361、ADRV9009、ADRV9026这三… · 2026/9/27 11:10:51
STM32F103 窗口看门狗 WWDG 实战:窗口期计算、喂狗时机与复位周期实测 文章目录摘要前言WWDG 工作原理:一个带"时间笼子"的看门狗窗口期数学推导:先把时间算明白方案决策:为什么是 WWDG 而不是 IWDG硬件准备与测试环境CubeMX 配置与寄存器级解释容易遗漏的步骤:调试冻结与中断使能核心代码实… · 2026/9/27 11:57:54
小米开源编程助手 MIMO Code 上手:VS Code 配置 TaoToken 与简单使用测试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:47
图解步骤拆解响应式网站的意义:告别域名服务器搞不懂的坑 图解步骤拆解响应式网站的意义:告别域名服务器搞不懂的坑 域名服务器配置报错,后台代码看不懂,这种“域名服务器搞不懂”的焦虑,是90%中小企业老板在接触网站建设时的第一道坎。别急着找外包公司,先看懂这套 图解步骤 ,你就能明白为什么… · 2026/9/27 11:57:47
科来流量分析结合MCP自动化:用Codex与cmdl.exe打通TaoToken配置链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:41
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01