这一章从"怎么写"的角度讲GraphQL服务端的工程实践。两种Schema设计模式(Schema-First和Code-First)各有适用场景,解析器的实现涉及多种数据源的连接策略,N+1查询问题需要DataLoader来解决,认证授权和错误处理是生产环境的必修课,Schema拼接和联邦架构是大规模系统的演进方向。
读完这章,你能搭建一个可运行的、经过基本优化的GraphQL服务。
第一节:Schema 设计模式。Schema-First 和 Code-First 两种路线各有利弊——前者让契约先行、适合跨团队协作,后者让类型单一来源、适合快速迭代。这一节给出两种模式的完整示例和选型标准。
第二节:解析器实现与数据源连接。解析器不只是"查个库"那么简单:从 SQL 到 Redis、从外部 REST 到 gRPC,不同数据源的接入方式、连接池管理、事务边界处理,都是本节内容。
第三节:N+1 查询问题与 DataLoader 模式。GraphQL 的解析器模型天然容易触发 N+1,DataLoader 用"批处理 + 去重 + 请求级缓存"解决它。这一节讲透批处理函数的写法、生命周期和常见错误。
第四节:认证授权与错误处理。生产环境绕不开的两件事:身份认证怎么贯穿解析器上下文、字段级授权怎么设计、错误如何分类并安全地暴露给客户端。
第五节:Schema 拼接与联邦架构。当一个团队维护不下一个单体 Schema 时,Schema Stitching 和 Apollo Federation 是两条演进路径。这一节对比两者的机制,并给出联邦子图的完整写法。
本章的实践性最强,建议边读边搭:用一个最小的 TypeScript 项目,从 Schema-First 模式写起,逐步加上数据源连接、DataLoader、认证授权和错误处理,最后用联邦把两个子图拼起来。这个动手过程会暴露大量"看书觉得会了、上手就卡住"的细节——比如 DataLoader 的批处理窗口、错误在解析器链里的传播路径,都是踩过坑才记得住的。