ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Prisma + TypeScript 快速上手:5 分钟构建并部署 GraphQL 后端

Prisma + TypeScript 快速上手:5 分钟构建并部署 GraphQL 后端 Prisma TypeScript 快速上手5 分钟构建并部署 GraphQL 后端【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1本指南以当前仓库 docs/1.3/01-Quickstart/01-Backend/01-TypeScript/01-TypeScript.md 为骨架演示如何用 TypeScript 搭建一个 GraphQL 服务器以graphql-yoga作为 Web 服务器通过prisma-binding连接被称为 GraphQL database 的 Prisma 数据库服务并借助 Docker 在本地集群完成部署。读完本文你将掌握prismaCLI 的初始化与部署流程、Prisma 服务与 GraphQL boilerplate 项目的目录结构、双 Playground 的使用方法以及面向应用 schema 与 Prisma CRUD API 的查询和变更mutation实践。Step 1安装所需的命令行工具在整个教程过程中你需要用 Prisma CLI 来创建和管理 Prisma 数据库服务因此第一步是安装 CLI。在终端中全局安装 Prisma CLInpm install -g prisma从本仓库源码看init、deploy、local等命令由prisma-cli-core包实现入口位于 cli/packages/prisma-cli-core/src/commands而命令执行框架来自 cli/packages/prisma-cli-engine所有子命令均基于其中的Command基类注册 topic、args 与 flags。除此之外你的机器上还必须安装 Docker。如果尚未安装请前往官网下载Mac OShttps://www.docker.com/docker-macWindowshttps://www.docker.com/docker-windows下载完成后直接安装即可安装后你也会同时获得dockerCLI 的访问权限。最后一步是启动本地开发集群local development cluster稍后你要把 Prisma 服务部署到这个集群上。在终端中执行prisma local start关于该命令的更多细节可参考 prisma local start 命令参考它会启动名为local的默认本地集群也支持通过-n, --name NAME指定集群实例名例如prisma local start --name mycluster如果该集群此前不存在命令还会自动把它以键mycluster写入本地集群注册表~/.prisma/config.yml。Step 2用prisma init引导创建 GraphQL 服务器接下来使用prisma init引导创建你的 GraphQL 服务器。注意该命令会触发一个交互式提示让你选择项目所基于的模板。因为向prisma init传入了my-app作为参数CLI 会新建一个名为my-app的目录并把项目的所有文件放进去prisma init my-app当被问到如何设置 Prisma 服务时选择GraphQL server/fullstack boilerplate (recommended)。随后 CLI 会提示你选择一个 GraphQL boilerplate 作为项目基础这里选择typescript-basicboilerplate即typescript-graphql-server仓库中的basic模板。最后当被问到要部署到哪个集群时选择local集群。prisma init结束后你的 Prisma 数据库服务即已部署可通过http://localhost:4466/my-app/dev访问。从源码实现看prisma init的交互逻辑位于 cli/packages/prisma-cli-core/src/commands/init/init.ts它先检查目标目录是否已存在可能冲突的文件如prisma.yml、datamodel.prisma随后通过EndpointDialogcli/packages/prisma-cli-core/src/utils/EndpointDialog.ts完成集群、数据库类型、服务名、stage 等信息的采集最终生成prisma.yml、datamodel.prisma在本地集群场景下还会生成docker-compose.yml和包含PRISMA_MANAGEMENT_API_SECRET的.env。若选择了生成器还会自动执行prisma generate。关于该命令的完整用法包括-b, --boilerplateflag 与示例参见 prisma init 命令参考。服务端点的组成你或许已经注意到数据库服务的 HTTP 端点由以下几个部分拼接而成集群域名即~/.prisma/config.yml中host属性的值http://localhost:4466/my-app/devPrismaservice的名称定义在prisma.yml中my-app服务部署到的 stage默认名为dev这个端点被引用在src/index.ts中用来实例化Prisma从而在应用 schema 与 Prisma schema 之间建立绑定bindingconst server new GraphQLServer({ typeDefs: ./src/schema.graphql, // points to the application schema resolvers, context: req ({ ...req, db: new Prisma({ endpoint: http://localhost:4466/my-app/dev, // the endpoint of the Prisma DB service secret: mysecret123, // specified in database/prisma.yml debug: true, // log all GraphQL queries mutations }), }), })其中secret: mysecret123对应database/prisma.yml中配置的服务密钥用于生成访问 Prisma API 所需的 JWT 令牌debug: true则会在服务器日志中打印所有 GraphQL 查询与变更。Step 3认识生成的项目文件结构prisma init生成的项目文件结构如下对应typescript-basicboilerplate/根目录.graphqlconfig.ymlGraphQL 配置文件包含端点与 schema 配置供graphql-cli与 GraphQL Playground 使用遵循graphql-config标准格式。/databasedatabase/prisma.yml数据库服务的根配置文件。prisma.yml支持的全部字段service、datamodel、cluster、stage、disableAuth、secret、schema、subscriptions、seed、custom等可参考 prisma.yml 配置参考。database/datamodel.graphql你为项目定义的数据模型用 SDL 编写是数据库的基石下一节详述。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.ts服务器入口把所有部分串起来并启动来自graphql-yoga的GraphQLServer。当前阶段对你最重要的是database/datamodel.graphql和src/schema.graphql。数据模型是整个 API 的基础src/schema.graphql中定义并暴露给客户端的 API 正是构建在它之上。typescript-basic模板默认的数据模型如下type Post { id: ID! unique isPublished: Boolean! title: String! text: String! }基于这个数据模型Prisma 会生成Prisma schema——一个为数据模型中所有类型定义 CRUD API 的 GraphQL schema。该 schema 存放在src/generated/prisma.graphql每次你对数据模型做修改并执行deploy时CLI 都会自动更新它。关于 SDL 数据模型的更多建模规则可参考 Data Modelling (SDL) 参考.md)。至此你可以启动服务器了。Step 4启动服务器调用package.json中定义的dev脚本它会启动服务器并为你打开一个 GraphQL Playgroundcd my-app yarn dev注意这个 Playground 让你可以并排与两个 GraphQL API 交互appWeb 服务器的 GraphQL API定义在应用 schema来自./src/schema.graphqldatabasePrisma 数据库服务的 CRUD GraphQL API定义在Prisma schema来自./src/generated/prisma.graphql每个 Playground 都自带自动生成的文档展示你可以向该 API 发送的所有 GraphQL 操作查询、变更以及订阅文档位于 Playground 最右侧边缘。Playground 打开后就可以发送查询和变更了。针对应用 schema 发送查询与变更应用 schemasrc/schema.graphql定义的 GraphQL API 可以通过appPlayground 访问。把下面的 mutation 粘贴到appPlayground 左侧面板然后点击Play按钮或使用快捷键CMDEntermutation { createDraft( title: GraphQL is awesome!, text: It really is. ) { id } }如果此时发送feed查询服务器仍然会返回空列表。这是因为feed只返回isPublished为true的Post节点——而通过createDraftmutation 创建的Post并不满足该条件。你可以对某个Post调用publishmutation 来发布它。把createDraftmutation 返回的Post的id复制出来替换下面 mutation 中的__POST_ID__占位符mutation { publish(id: __POST_ID__) { id isPublished } }现在终于可以发送feed查询了已发布的Post会被返回query { feed { id title text } }针对 Prisma API 发送查询与变更Prisma schemasrc/generated/prisma.graphql定义的 GraphQL CRUD API 可以通过databasePlayground 访问。由于此时直接面对数据库 API你不再受限于应用 schema 中的操作而是可以利用完整的 CRUD 能力直接创建一个isPublished为true的Post节点mutation { createPost( data: { title: What I love most about GraphQL, text: That it is declarative., isPublished: true } ) { id } }这个 mutation 创建的Post节点会立刻被应用 schema 中的feed查询返回因为它的isPublished字段是true。在databasePlayground 中你还可以发送 mutation 来更新和删除已有的 post为此你需要先知道它们的id。在databasePlayground 中发送如下查询{ posts { id title } }从返回的Post节点中复制你刚创建的那一条title为What I love most about GraphQL的id替换下面 mutation 中的__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.。最后要删除一个Post节点可以发送如下 mutation同样需要把__POST_ID__替换为真实idmutation { deletePost( where: { id: __POST_ID__ } ) { id title text } }小结从数据模型到双 API 的链路回顾整条链路可以看到 Prisma 的数据建模与 API 生成是高度自动化的你在database/datamodel.graphql中用 SDL 定义类型如Postprisma deploy基于它生成 Prisma schemasrc/generated/prisma.graphql从而获得完整 CRUD API而src/index.ts中通过new Prisma({ endpoint, secret, debug })创建的绑定让graphql-yoga的应用层解析器可以安全地访问数据库层的 CRUD API。源码层面集群配置如local集群的baseUrl、是否本地、是否需要鉴权等属性由 cli/packages/prisma-yml/src/Cluster.ts 中的Cluster类建模这解释了为什么prisma init在选择local集群后端点会落在本地 Docker 容器的4466端口上。你可以沿用这套数据模型 → 生成 Prisma API → 应用 schema 封装的模式把Post替换为自己的业务类型快速扩展成完整的 TypeScript GraphQL 服务。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表