首页/新闻资讯/正文详情

使用 Prisma 引导构建基于 Node.js 的 GraphQL 服务端:从 graphql-yoga 到 prisma-binding 的完整实战

发布时间:2026/9/23 16:33:29 来源:云帆数科 栏目:资讯中心
使用 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:28

数据分析实用网站清单:从入门学习到项目实战的资源地图
数据分析实用网站清单:从入门学习到项目实战的资源地图

开头经常有读者问我:想做数据分析,到底该上哪些网站?尤其是刚入行的朋友,一搜“数据分析”满屏都是广告课,真正能上手练、能查资料、能找数据集的地方反而被淹没了。这篇文章我直接按照自己的使用习惯,把这… · 2026/9/23 16:33:22

DKG分布式密钥生成:从原理到工程落地的完整实践指南
DKG分布式密钥生成:从原理到工程落地的完整实践指南

1. 一次密钥单点事故引出的问题:为什么传统托管方案扛不住前阵子帮一个做联盟链基础设施的团队做技术咨询,场景很典型:他们的验证节点集群握着一把“超级私钥”,负责给链上交易做排序签名、给跨链消息做背书验证。这把这个私钥放在… · 2026/9/23 16:33:22

QCM6490平台DDR测试实战:QDUTT、眼图与信号完整性分析
QCM6490平台DDR测试实战:QDUTT、眼图与信号完整性分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 6:20:21

Flink Native Kubernetes 部署实战:会话模式、应用模式与 Pod 模板配置全指南
Flink Native Kubernetes 部署实战:会话模式、应用模式与 Pod 模板配置全指南

大数据流处理批处理数据工程 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 点击查看 免费下载 本指南基于 Apache Flink 的 Kubernetes 原生集成(Native Kubernetes)资源提供方,完整讲解如何将 Fl… · 2026/9/24 6:20:09

电流检测电路六种方案详解:原理、对比与选型指南
电流检测电路六种方案详解:原理、对比与选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 6:20:09

PHPStan 错误指南:如何理解并修复 “Unsafe usage of new static()“
PHPStan 错误指南:如何理解并修复 “Unsafe usage of new static()“

开发工具代码质量静态分析 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan 点击查看 免费下载 本篇技术指南围绕 PHPStan 错误标识符 new.static 展开… · 2026/9/24 6:20:09

Presto Release 0.161 技术详解:ORDER BY 语义变更、EXCEPT 正确性修复与连接器增强
Presto Release 0.161 技术详解:ORDER BY 语义变更、EXCEPT 正确性修复与连接器增强

大数据数据库后端 【免费下载链接】presto The official home of the Presto distributed SQL query engine for big data 项目地址: https://gitcode.com/gh_mirrors/pre/presto 点击查看 免费下载 导读 本文基于 Presto 官方发布说明 release-0.161.rst&#xf… · 2026/9/24 6:19:56

Vega Voronoi 变换完全指南:基于 vega-voronoi 计算数据点单元路径
Vega Voronoi 变换完全指南:基于 vega-voronoi 计算数据点单元路径

数据可视化 【免费下载链接】vega A visualization grammar. 项目地址: https://gitcode.com/gh_mirrors/ve/vega 点击查看 免费下载 vega-voronoi 是 Vega 生态中专门负责计算 Voronoi(沃罗诺伊)图变换的独立数据流(dataflow&am… · 2026/9/24 6:19:50

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码