【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载本篇文章是对 howtographql 仓库中《Building a GraphQL Server with JavaScript Node.js》系列教程的收官总结系统回顾了以 Node.js、apollo-server 与 Prisma 为核心的技术栈如何从零搭建一个功能完备的 GraphQL 服务器。读完本篇你将完整掌握该教程覆盖的 GraphQL 服务端开发路径——从 schema 定义、resolver 实现到数据库接入、认证授权、实时订阅与过滤分页排序并了解后续深入学习的社区资源。教程全景你在这 9 章里构建了什么整个教程的目标是构建一个 Hacker News 克隆的后端 API全程遵循schema-firstschema 驱动开发流程先扩展 GraphQL schema 定义新的根字段与对象类型再为这些字段实现对应的 resolver 函数。这一过程在教程的每一章反复出现是贯穿始终的核心方法论具体可参见 2-a-simple-query.md 中对扩展 schema 定义 → 实现 resolver 函数两步流程的说明。按章节顺序你实际完成的是一条完整的后端演进路线项目初始化与第一个查询1-getting-started.md创建hackernews-node项目、安装apollo-server与graphql实现info: String!查询并理解 GraphQL schema 的三类根类型Query、Mutation、Subscription。查询与变更2-a-simple-query.md、3-a-simple-mutation.md实现feed查询与post变更数据先以内存数组存储并理解 resolver 的parent与args参数。接入数据库4-adding-a-database.md引入 SQLite 与 Prisma通过schema.prisma数据模型、迁移与 Prisma Client 生成让数据持久化。连接服务器与数据库5-connecting-server-and-database.md通过 GraphQLcontext参数把PrismaClient实例注入所有 resolver。认证与授权6-authentication.md实现signup/login变更用 JWT 与 bcrypt 保护需要登录的操作。实时订阅7-subscriptions.md用PubSub与 WebSocket 实现newLink、newVote实时推送。过滤、分页与排序8-filtering-pagination-and-sorting.md为feed查询增加filter、skip/take、orderBy参数并返回总数count。正是这条路线最终成就了本总结文档9-summary.md所回顾的完整成果一个基于 Node.js、apollo-server 与 Prisma 的、具备过滤、认证、分页与订阅能力的生产级 GraphQL 服务器。技术栈三大支柱Node.js运行时基础Node.js 是整个服务的运行时环境项目通过npm init -y初始化出package.json作为依赖与脚本的配置文件。教程明确使用了apollo-server^2与graphql^14.6.0两个核心依赖并在 1-getting-started.md 中给出了完整的安装命令。需要说明的是该教程基于 apollo-server 2.x 编写仓库中的引言章节0-introduction.md也提示了这是一份略显过时的教程并推荐查阅 Prisma 官方更新的端到端类型安全系列文章阅读时请注意版本差异。apollo-serverGraphQL 服务器库apollo-server是构建在 Express.js 之上的功能完备、开箱即用的 GraphQL 服务器库它承担了 schema 解析、resolver 编排、GraphQL Playground 托管与订阅传输等职责。在 1-getting-started.md 中教程列出了它的核心特性这些特性与总结文档快速而简单、自带多项开箱即用功能的描述完全对应GraphQL 规范兼容严格遵循 GraphQL 规范实现实时功能原生支持 GraphQL subscriptionsGraphQL Playground 开箱即用无需额外配置即可获得交互式 IDE可通过 Express 中间件扩展便于接入认证、日志等横切能力支持 schema 中的自定义指令可解析自定义 directive查询性能追踪内置 query performance tracing随处可部署可部署到 Vercel、AWS Lambda、Heroku 等平台。在代码层面服务器的最小骨架是定义typeDefsschema 字符串与resolvers实现对象再通过new ApolloServer({ typeDefs, resolvers })实例化并server.listen()启动。教程还展示了typeDefs既可直接传字符串、也可通过fs.readFileSync读取独立的schema.graphql文件方便 schema 与逻辑分离。Prisma数据库访问层Prisma 是一个开源数据库工具包它把 resolver 与数据库之间的数据访问封装成干净、类型安全的查询 API。总结文档明确说明你的 GraphQL 服务器的 resolver 使用 Prisma Client 实现Prisma Client 负责数据库访问。 在 4-adding-a-database.md 中Prisma 被拆解为三个组成部分Prisma Client自动生成、类型安全的 Node.js/TypeScript 查询构建器Prisma Migrate实验性声明式数据建模与迁移系统Prisma Studio实验性可视化管理数据库数据的 GUI。其中schema.prisma文件相当于数据库 schema包含三个组成部分data source数据库连接如provider sqlite、url file:./dev.db、generator声明生成 Prisma Client、data model定义模型每个模型映射为底层数据库的一张表。context 参数resolver 与数据库之间的桥梁教程中连接服务器与数据库的关键设计是 GraphQL resolver 的context参数。在 5-connecting-server-and-database.md 中详细讲解了它的机制所有 resolver 函数固定接收四个参数parent、args、context、infocontext是一个普通的 JavaScript 对象resolver 链上的所有 resolver 都可以读写它是 resolver 之间通信的手段在服务器初始化时即可向context写入内容——教程把PrismaClient实例作为prisma属性挂载到context上随后每个 resolver 都能通过context.prisma访问数据库。初始化写法如下出自该章的示例代码const prisma new PrismaClient() const server new ApolloServer({ typeDefs: fs.readFileSync(path.join(__dirname, schema.graphql), utf8), resolvers, context: { prisma, } })之后在 resolver 中即可直接调用 Prisma Client 的 CRUD API例如feed用context.prisma.link.findMany()读取所有链接post用context.prisma.link.create({ data: { url, description } })写入新链接。教程特别指出Prisma 的 CRUD 操作全部是异步的返回Promise对象——Apollo Server 能够自动检测并解析 resolver 返回的Promise因此无需手动await处理。进入认证章节后context升级为函数形式context: ({ req }) ({ ...req, prisma, userId: ... })这样还能把承载请求的 HTTPrequest对象一并挂载使 resolver 可以读取Authorization头中的 JWT 来校验用户身份。教程覆盖的关键能力盘点认证与授权Authentication在 6-authentication.md 中你为 API 增加了signup与login两个变更返回统一的AuthPayload包含token与usersignup先用bcrypt.hash(password, 10)加密密码再用prisma.user.create落库最后用jwt.sign({ userId: user.id }, APP_SECRET)签发令牌login用prisma.user.findUnique({ where: { email } })查找用户用bcrypt.compare校验密码通过后签发令牌保护操作post变更通过getUserId辅助函数解析Authorization头中的Bearer令牌获取userId解析失败即抛出异常从而阻止未认证请求同时通过 Prisma 的嵌套写入postedBy: { connect: { id: userId } }把新链接与用户关联起来。教程还演示了如何把User/Link之间的关联字段postedBy、links显式实现为关系 resolver因为这类字段无法被服务器自动推断。过滤、分页与排序8-filtering-pagination-and-sorting.md 为feed查询逐步叠加了三个维度过滤接受filter: String参数构造 Prisma 的where对象用OR: [{ description: { contains } }, { url: { contains } }]匹配标题与链接分页采用limit-offset 分页——Prisma API 中 limit 对应take取多少条offset 对应skip跳过多少条默认 0教程还对比了更高级的 cursor-based游标分页模型排序定义LinkOrderByInput输入类型与Sort枚举asc/desc通过orderBy: args.orderBy透传给 Prisma总数重构出Feed类型links: [Link!]!count: Int!用context.prisma.link.count({ where })统计总数。实时订阅Subscriptions7-subscriptions.md 讲解了 GraphQL 订阅机制订阅允许服务器在特定事件发生时向客户端推送数据通常基于WebSocket实现打破了此前所有交互都遵循的请求-响应循环。实现要点包括在context中挂载apollo-server提供的PubSub实例与挂载PrismaClient的方式一致在 schema 中定义Subscription类型如newLink: Link、newVote: Vote订阅 resolver 与普通 resolver 不同它不直接返回数据而是返回AsyncIterator并以{ subscribe, resolve }对象形式提供在触发事件的变更如post、vote中调用pubsub.publish(NEW_LINK, newLink)推送数据订阅端与发布端通过相同的事件字符串关联。测试订阅的典型做法是打开两个 GraphQL Playground 窗口一个发送subscription建立长连接界面显示等待事件的加载动画另一个发送会触发事件的post变更随后订阅窗口实时收到推送。继续深入 GraphQL 生态的社区资源总结文档在收尾处为想继续深入 GraphQL 的读者列出了四个社区资源这里以纯文本形式保留其名称与定位这些是官方文档提供的公开资源具体地址请通过搜索引擎查询对应官网Prisma BlogPrisma 官方博客定期发布 GraphQL 相关的新内容涵盖社区新闻、技术深挖与各类教程GraphQL Weekly每周一期的 GraphQL 生态新闻邮件订阅GraphQL Conf在柏林举办的全球最大规模 GraphQL 爱好者聚会Prisma Slack围绕 GraphQL 与 Prisma 展开活跃讨论的 Slack 团队。此外仓库内每个章节都配有对应的 Quiz 测验见各章节 frontmatter 的question字段与实战练习例如 3-a-simple-mutation.md 末尾给出了为Link补全 CRUDlink、updateLink、deleteLink的可选练习是检验学习成果的好素材。结语通过这条完整的学习路径你掌握的不只是某个框架的用法而是一套可复用的 GraphQL 服务端工程方法论以 schema 为契约驱动开发、用 resolver 统一编排数据获取、以context完成依赖注入、借 Prisma 屏蔽数据库细节、用订阅打通实时通道。这套组合正是 9-summary.md 所总结的核心——一个由 Node.js 提供运行时、apollo-server 提供 GraphQL 能力、Prisma Client 提供数据访问的完整后端方案。接下来不妨把你的 Hacker News API 继续扩展下去或者对照仓库中的前端教程如 react-apollo、vue-apollo为它接上一个真实的前端客户端完成从后端到前端的全栈闭环。赞分享【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载相关推荐OpenCore Legacy Patcher如何让2007年的老Mac运行macOS SonomaOpenCore Legacy Patcher如何让2007年的老Mac运行macOS Sonoma 你是否有一台被苹果官方抛弃的老旧Mac设备却渴望体验RevokeMsgPatcher 防撤回完整指南PC 微信、QQ、TIM 消息不再被覆盖RevokeMsgPatcher 防撤回完整指南PC 微信、QQ、TIM 消息不再被覆盖 刚发出去的关键消息下一秒就变成对方已撤回一条消息原文再也找不开发工具AI 应用AI 技能使用 graphql-yoga 与 Prisma 从零构建 GraphQL Server完整实战教程使用 graphql yoga 与 Prisma 从零构建 GraphQL Server完整实战教程 导读 本文以 Prisma 开源仓库 1.12 文档中的后端数据库GraphQL上一篇Visual Syslog Server终极指南5步打造Windows平台企业级日志监控系统下一篇终极指南5分钟上手暗黑破坏神2存档可视化编辑器告别复杂十六进制操作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
MCP协议与Dify集成教程:用TaoToken统一Key打通工具调用链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 11:01:53
物理引擎+LLM:破解PCB自动布线难题的新范式 PCB布线这事,做了十年硬件的人都有共鸣:自动布线器从来都是“能用,但不好用”。你让它在两三层板上跑个简单电路还行,一旦碰上高速信号、差分对、阻抗控制这些硬约束,自动布线器基本就是给你画一堆需要手工重来的飞线。… · 2026/9/25 11:01:53
JMeter与Locust深度对比:从并发模型到选型落地 性能测试自动化这块,JMeter和Locust的讨论热度从来没降过。群里天天有人问“到底选哪个”“两个都装了是不是重复造轮子”,打开招聘JD一看,性能测试工程师的任职要求里经常两个都点名。我用了这么多年、带队做过不少压测项目,可以… · 2026/9/25 11:01:47
昇腾Atlas 300V部署YOLO全流程:环境搭建、模型转换与调优 1. Atlas到底是什么:一张运算加速卡还是整套AI工具箱1.1 先分清Atlas产品家族:300V只是其中一个推理端点最近后台收到不少私信,标题就是“atlas”三个字母,再往下翻,关联词基本都落在“atlas部署yolo”和“atlas 300v … · 2026/9/25 11:39:45
智能体技能库搭建全解析:从技能工程到实战避坑 这就是“agent-skills”在实战中最真实的三个回答:一方面,它告诉你智能体的能力边界不是模型决定的,而是你给它装备了多少可落地的技能;另一方面,它逼着你把“让模型变聪明”的模糊愿望,翻译成“有输入、有… · 2026/9/25 11:39:33
AI Agent中的function call详解:用TaoToken统一Key打通工具调用链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 11:39:33
Apache Iceberg Spark 查询指南:SQL、DataFrame、时态旅行与元数据表实战 数据湖大数据数据存储 【免费下载链接】iceberg Apache Iceberg 项目地址: https://gitcode.com/gh_mirrors/icebe/iceberg 点击查看 免费下载 Apache Iceberg 通过 Spark 的 DataSourceV2 API 实现了完整的查询能力,本文基于仓库中的 spark-queries.md… · 2026/9/25 11:39:33
Agent工具调用失败处理:结构化错误与自主恢复实践 1. 工具运行时的核心设计哲学1.1 为什么“失败”值得被当作一等公民做 Agent 开发的人都有一个共识:工具调用是整个系统里最容易出问题的环节。模型再聪明,一旦进入 toolRun 阶段,面对的就是真实世界的混沌——网络抖动、参数格式错误、第三方… · 2026/9/25 11:39:33
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37