使用 Prisma 引导构建基于 Node.js 的 GraphQL 服务端:从 graphql-yoga 到 prisma-binding 的完整实战
后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载本篇技术指南基于本仓库经典 Prisma / prisma1 一代 CLI 与文档体系中的快速上手教程讲解如何以 Node.js 为语言栈、以graphql-yoga为 Web 服务器、以prisma-binding为数据访问层在 5 分钟内搭建一个连接 Prisma 数据库 API 的 GraphQL 服务端。读完本文你将掌握从 CLI 工具安装、graphql create脚手架引导、prisma.yml服务配置、数据模型定义到双 Playground 下分别操作应用层 API 与数据库层 CRUD API 的完整工作流并理解“GraphQL ORM”这一核心抽象在底层是如何通过 Prisma Binding 实现的。背景Prisma 在 GraphQL 服务端中的角色在本教程中你的 GraphQL 服务端由两部分协作而成graphql-yoga一个开箱即用、功能完整的 GraphQL 服务器Web 服务器层负责接收客户端请求、执行应用层 schema 定义的解析器resolvers。prisma-binding一个将 Prisma 数据库 API 暴露为可编程 GraphQL 客户端的绑定层。你可以把它理解为一种 “GraphQL ORM”——通过Prisma实例你可以在 Node.js 代码中直接以对象方法的形式调用对数据库的 CRUD 操作而不必手写底层 GraphQL 请求字符串。prisma-binding的实现在本仓库的 cli/packages/prisma-client-lib/src/Client.ts 中可以看到Client类对外暴露了query、mutation、$subscribe、$graphql、$exists等核心 API见该文件 L48-L52内部则持有_endpoint、_secret、_client基于http-link-dataloader的批量请求客户端等实现细节见 L56-L60。也就是说文档中new Prisma({...})创建的对象底层正是这样一个封装了 endpoint、typeDefs 与调试开关的 GraphQL 客户端。本文配套的完整项目代码对应GraphQL boilerplate中的node-basic模板。本仓库定位为经典 Prismaprisma1一代的镜像其 CLI 命令在当前源码中以prisma1出现参见 deploy 命令示例下文同时标注了文档时代的原始命令写法。Step 1安装所需的命令行工具整个教程中你会用到两类命令行工具Prisma CLI用于创建和管理 Prisma 数据库 API部署服务、更新数据模型。GraphQL CLI用于围绕 GraphQL 服务器开展若干工作流如引导项目、拉取 schema、代码生成等。打开终端通过 npm 全局安装两者npm install -g prisma graphql-cli安装完成后可用prisma1 --version/prisma --version验证 Prisma CLI 是否就绪本仓库一代 CLI 源码位于 cli/packages/prisma-cli。Step 2使用graphql create引导 GraphQL 服务端接着使用 GraphQL CLI 的graphql create命令引导出整个 GraphQL 服务器的代码骨架graphql create my-app --boilerplate node-basic该命令接收两个参数my-appCLI 将存放所有项目文件的目录名。--boilerplate node-basic指定以哪个 GraphQL boilerplate 作为服务端的起步模板starter kit。graphql create执行完成后你的 Prisma 数据库 API 就已经被部署并且可通过my-app/database/prisma.yml中指定的endpoint进行访问。这里补充一个与本仓库一致的底层视角prisma.yml是 Prisma 服务的根配置文件而服务初始化本身也可由 Prisma CLI 的init命令完成——在 cli/packages/prisma-cli-core/src/commands/init/init.ts 中可以看到初始化会生成prisma.yml与datamodel.prisma两个文件L90-L97前者内容形如endpoint: endpoint datamodel: datamodel.prisma这与 boilerplate 模板中database/prisma.yml的职责一致声明 endpoint 与数据模型入口。Step 3理解生成的项目结构与核心文件3.1 整体文件布局graphql create生成的my-app项目结构如下以下路径均为相对my-app根目录.graphqlconfig.ymlGraphQL 配置文件包含各项目的 endpoint 与 schema 配置供graphql-cli与 GraphQL Playground 使用。/databasedatabase/prisma.ymlPrisma 数据库 API 的根配置文件。完整字段说明可参考本仓库的 prisma.yml 概览文档。database/datamodel.graphql用 SDLSchema Definition Language书写的项目数据模型下文会重点讨论。database/seed.graphql包含若干 mutation用于向数据库写入初始种子数据。/srcsrc/schema.graphql定义你的应用 schemaapplication schema即你想暴露给客户端应用的那部分 GraphQL API。src/generated/prisma.graphql定义Prisma schema即数据模型中各类型的 CRUD API。该文件由datamodel.graphql自动生成绝不应手动编辑如需变更只能修改datamodel.graphql后重新运行prisma deploy。src/index.js服务端入口负责把所有部分组装起来并启动来自graphql-yoga的GraphQLServer。此时对你最重要的两个文件是database/datamodel.graphql和src/schema.graphql前者定义数据模型后者定义暴露给客户端的应用 API二者是“数据基础”与“对外接口”的关系。3.2 数据模型datamodelboilerplate 自带的数据模型如下type Post { id: ID! unique isPublished: Boolean! default(value: false) title: String! text: String! }基于该数据模型Prisma 会生成Prisma 数据库 schema——一份定义数据模型各类型 CRUD API 的 GraphQL schema。这份 schema 存放在src/generated/prisma.graphql并且每次你对数据模型执行deploy时都会被 CLI 自动更新。3.3 在src/index.js中创建 Prisma Bindingendpoint不仅在prisma.yml中声明还会被src/index.js引用。在那里它被用来实例化Prisma从而基于“应用 schema Prisma 数据库 schema”创建一层 GraphQL bindingconst server new GraphQLServer({ typeDefs: ./src/schema.graphql, resolvers, context: req ({ ...req, db: new Prisma({ typeDefs: src/generated/prisma.graphql, // the auto-generated GraphQL schema of the Prisma API endpoint: __PRISMA_ENDPOINT__, // the endpoint of the Prisma API debug: true, // log all GraphQL queries mutations sent to the Prisma API // secret: mysecret123, // only needed if specified in database/prisma.yml }), }), })关键配置项说明typeDefsPrisma API 的自动生成 schema 路径即src/generated/prisma.graphql。endpointPrisma API 的 HTTP 地址来自database/prisma.yml。debug: true开启后会把发送给 Prisma API 的所有 GraphQL query 与 mutation 打印出来便于调试。secret仅当database/prisma.yml中配置了secret时才需要。正如 prisma.yml 概览文档所强调的secret用于签发 JWT请求时需在 HTTP 的Authorization头携带如果不配置 secretPrisma API 将无鉴权即可访问生产环境务必注意。借助db这个绑定对象你的 resolvers 便可以在 Node.js 代码中直接调用如db.query.posts(...)、db.mutation.createPost(...)之类的方法——这正是文档所说 “GraphQL ORM” 层的直观体验也是 Client.ts 中query/mutation能力的封装结果。Step 4启动服务端执行package.json中定义的dev脚本它会启动服务器并为你打开一个 GraphQL Playgroundcd my-app yarn dev注意这个 Playground 允许你并排与两个 GraphQL API 交互appWeb 服务器的 GraphQL API由应用 schema./server/src/schema.graphql定义。databasePrisma 数据库 API 的 CRUD GraphQL API由Prisma schema./server/src/generated/prisma.graphql定义。每个 Playground 都自带自动生成的文档展示你可以向该 API 发送的所有 GraphQL 操作query、mutation 以及 subscription文档位于 Playground 最右侧边缘。Step 5针对应用 schema 发送 query 与 mutation应用 schemasrc/schema.graphql定义的 GraphQL API 可以通过appPlayground 访问。5.1 创建草稿createDraft把下面的 mutation 粘贴到appPlayground 左侧面板点击Play按钮或使用快捷键CMDEntermutation { createDraft( title: GraphQL is awesome!, text: It really is. ) { id } }5.2 发布文章publish如果此时发送feedquery服务器仍会返回空列表。原因在于feed只返回isPublished为true的Post节点——而通过createDraft创建的节点isPublished是false。你可以通过publishmutation 发布一个Post先复制createDraft返回的Post节点的id用它替换下面 mutation 中的__POST_ID__占位符mutation { publish(id: __POST_ID__) { id isPublished } }5.3 读取已发布内容feed现在发送feedquery被发布的Post就会被返回query { feed { id title text } }Step 6针对 Prisma 数据库 API 发送 query 与 mutationPrisma schemasrc/generated/prisma.graphql定义的 GraphQL CRUD API 可以通过databasePlayground 访问。由于你是直接对着数据库 API 操作你将不再受应用 schema 中操作集合的限制而是可以使用完整的 CRUD 能力例如直接创建一个已发布的Post节点。6.1 直接创建已发布文章createPostmutation { createPost( data: { title: What I love most about GraphQL, text: That it is declarative., isPublished: true } ) { id } }注意这里data是 Prisma CRUD API 的参数形态嵌套对象与应用层的createDraft(title:, text:)扁平参数不同。因为该节点的isPublished为true应用 schema 中的feedquery 会直接把它返回。6.2 查询全部文章posts在databasePlayground 中你还可以发送 mutation 来更新与删除已有文章前提是知道它们的id。先查询全部文章{ posts { id title } }6.3 更新文章updatePost从返回的Post节点中复制你刚创建的那条title为What I love most about GraphQL的id替换__POST_ID__后发送mutation { updatePost( where: { id: __POST_ID__ }, data: { text: The awesome community. } ) { id title text } }该 mutation 会把text从That it is declarative.更新为The awesome community.。注意updatePost使用where定位记录、用data描述增量更新——这正是 Prisma CRUD API 中“定位条件 更新数据”分离的设计范式。6.4 删除文章deletePost最后删除一个Post节点同样需要把__POST_ID__替换为真实idmutation { deletePost( where: { id: __POST_ID__ } ) { id title text } }底层原理补充deploy 与生成的联动当你在database/datamodel.graphql中修改数据模型后需要重新部署服务才能让 Prisma API 同步更新。这一点在 deploy 命令实现中体现得很直接部署前会加载prisma.yml若datamodel属性缺失会直接报错L95-L99部署成功后会把新的endpoint写回prisma.ymlL125-L131部署阶段还会依据prisma.yml中的seed配置执行种子数据导入L444-L454。也就是说你在 Playground 里看到的所有 CRUD 操作都是datamodel.graphql → prisma deploy → src/generated/prisma.graphql这条生成链路的产物。作为佐证prisma-client-lib 的测试用例也展示了同一模式先给出typeDefs再以endpoint实例化客户端并执行查询——这正是src/index.js中new Prisma(...)的微缩版本。总结与后续方向在本快速上手教程中你完成了全局安装 Prisma CLI 与 GraphQL CLI用graphql create my-app --boilerplate node-basic引导出 Node.js GraphQL 服务端理解了prisma.yml、datamodel.graphql、src/schema.graphql、src/generated/prisma.graphql的分工在双 Playground 中分别对应用 schema 与 Prisma 数据库 API 执行了createDraft/publish/feed/createPost/posts/updatePost/deletePost等全套操作。若想继续深入可参考以下资源均为本仓库内的对应内容想要理解 Prisma 数据库层究竟如何工作可阅读 Prisma 核心概念与架构介绍 系列章节想深入掌握prisma.yml的每个配置项endpoint、secret、hooks、subscriptions、seed、custom及${}变量机制可阅读 prisma.yml 概览与示例想查看 Prisma Binding 客户端底层如何实现批量请求、订阅与调试输出可阅读 Client.ts想构建带鉴权、分页、过滤与实时订阅的完整 GraphQL 服务端可以参考本仓库 03-Tutorials2 下 Build GraphQL Servers 系列 的相关章节。赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐基于 Prisma 服务构建 GraphQL 服务器使用 graphql-yoga 与 prisma-binding 的完整实战基于 Prisma 服务构建 GraphQL 服务器使用 graphql yoga 与 prisma binding 的完整实战 本文是一篇完整的实战指南以后端数据库GraphQL使用 Prisma 与 TypeScript 引导构建 GraphQL 服务器graphql-yoga prisma-binding 完整实战使用 Prisma 与 TypeScript 引导构建 GraphQL 服务器graphql yoga prisma binding 完整实战 导读 本教后端数据库GraphQL使用 Prisma 引导搭建 Node.js GraphQL 服务器graphql-yoga 与 prisma-binding 实战指南使用 Prisma 引导搭建 Node.js GraphQL 服务器graphql yoga 与 prisma binding 实战指南 本指南以本仓库 do后端数据库GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

零基础学UE5:从蓝图到动画蓝图,新手入门指南

零基础学UE5:从蓝图到动画蓝图,新手入门指南

1. 为什么零基础反而更适合从UE5开始学很多人一听“虚幻引擎5”就觉得门槛高得离谱,觉得自己连代码都没写过几行,怎么可能玩得转这种做3A大作的东西。我刚开始接触的时候也是这个心态,后来真正上手才发现,恰恰是因为零基础&#x…

2026/9/23 16:33:29 阅读更多 →
中小网络组网实战指南:从IP规划到无线漫游与排错

中小网络组网实战指南:从IP规划到无线漫游与排错

简介:这是一份面向中小企业与网络运维人员的网络组网解决方案PDF文档。文档聚焦中小网络建设中“部署简单、管理智能、成本可控”的核心诉求,从企业网络建设背景、需求痛点切入,详细给出信锐中小企业网络的极简交付架构设计:只需网…

2026/9/23 16:32:28 阅读更多 →
从单机登录到 8 台节点共享登录态:分布式 Session 方案踩坑实录

从单机登录到 8 台节点共享登录态:分布式 Session 方案踩坑实录

一个周五下午的报警去年我们团队把一个单体应用拆成了 8 台 Tomcat 节点挂在 Nginx 后面,上线当天下午就收到客诉:"我明明登录了,一刷新就把我踢出去了,再登录又好了,来回踢皮球。"运维同事第一反应是应用有…

2026/9/23 16:32:28 阅读更多 →

最新新闻

EMC Isilon X400换内存指南:集群节点维护的完整闭环

EMC Isilon X400换内存指南:集群节点维护的完整闭环

简介:一份面向存储运维与硬件维护人员的EMC Isilon X400 DIMM内存更换手册PDF文档,专门解决X400节点内存故障时的合规更换问题。手册完整覆盖更换生命周期:前期下载Field Replacement Unit(FRU)包并收集日志&#xff0…

2026/9/23 20:03:16 阅读更多 →
Python KNN手写数字识别课程设计:源码解析与调参避坑指南

Python KNN手写数字识别课程设计:源码解析与调参避坑指南

简介:这是一份面向高校学生与Python初学者的KNN手写数字识别实战项目,可直接用于课程设计、期末大作业或算法入门练习。项目以Python实现KNN分类算法,配套完整手写数字数据集,代码含详细注释,新手也能看懂并快速部署运…

2026/9/23 20:03:16 阅读更多 →
淘宝美工收费表源码解析:从入门到精通的避坑指南

淘宝美工收费表源码解析:从入门到精通的避坑指南

淘宝美工收费表源码解析:从入门到精通的避坑指南 刚入行的朋友常陷入误区,以为背熟 CSS 语法就能直接上手电商详情页。现实是, 学会语法却不知怎么搭项目…

2026/9/23 20:03:16 阅读更多 →
OpenGL环境搭建全指南:GLFW与GLAD跨平台配置详解

OpenGL环境搭建全指南:GLFW与GLAD跨平台配置详解

1. 开始之前:OpenGL 到底是什么在聊环境搭建之前,我必须先泼一盆冷水:很多人买了 OpenGL 的书、保存了一堆教程,结果连第一个三角形都没看到,问题几乎都出在同一件事——他们以为 OpenGL 是一个“库”,下载…

2026/9/23 20:03:16 阅读更多 →
MFC屏幕截图实战:从GDI BitBlt到DPI与多显示器适配

MFC屏幕截图实战:从GDI BitBlt到DPI与多显示器适配

简介:面向 MFC/C 开发者的屏幕截图示例工程,基于 Visual Studio 和 MFC 框架,演示如何借助 GDI、CDC、CBitmap、BitBlt 等核心 API 捕获整个屏幕或指定窗口,并保存为 BMP/JPEG 文件。工程代码包含对话框界面与完整截屏实现&#x…

2026/9/23 20:03:16 阅读更多 →
做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做安防和弱电的朋友,大概率都经历过这样的“至暗时刻”:公司楼下是新装的智能枪机,仓库里还有十年前的老球机;总部用海康,分公司用大华,办公网里还“顺手”挂着几台萤石云、乐橙云的家用摄像头。每路摄像头…

2026/9/23 20:02:15 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →