
后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载导读本文基于 Midway Hooks 官方文档site/docs/hooks/prisma.md系统讲解如何在 Midway Hooks 一体化全栈应用中接入 Prisma ORM实现前端类型提示 后端参数校验 数据库操作一条链路打通的静态类型安全开发。读完本文你将掌握 Prisma Schema 建模、Client 初始化与引擎镜像加速、基于Api()触发器的查询/写入接口开发以及一体化调用与手动 HTTP 调用两种接入方式。为什么 Midway Hooks 推荐使用 PrismaMidway Hooks 的核心目标之一是让开发者在全栈开发中实现静态类型安全。而数据库层往往是类型安全最容易断裂的一环手写 SQL 或弱类型 ORM 都可能让类型在服务层 → 数据层之间丢失。为此官方文档明确推荐使用 Prisma 来构建数据库访问层。Prisma 是一款面向 Node.js TypeScript 设计的 ORM它提供了三组非常友好的能力Schema 定义使用声明式的schema.prisma文件描述数据模型与关系客户端生成根据 Schema 自动生成类型完备的 Prisma Client完全 TypeScript 支持查询结果、写入参数、关系查询全部具备完整类型推导。在 Midway Hooks 中接口函数的入参即前端调用参数零 Api 的一体化调用Prisma 生成的类型化客户端负责数据层。两者叠加就可以把intro.md中描述的一体化方案四大特性——零 Api、类型安全、全栈套件、强大后端见 site/docs/hooks/intro.md——中的类型安全从 HTTP 层一直延伸到数据库层前端基于函数签名与 Prisma 类型获得静态校验与类型提示后端通过Validate()校验传入参数数据库使用类型正确的数据完成读写。官方同时提供了一个名为hooks-prisma-starter的示例工程专门演示 Midway Hooks 与 Prisma 的组合用法。在 site/docs/hooks/fullstack.md 中全栈套件可直接使用的模板列表也包含react、vue、prisma三类其中 prisma 模板即本文所讲内容的具体落地。需要说明的是仓库内 site/docs/hooks/intro.md 在页面开头有一则维护提示一体化方案将逐步停止维护已有项目可以继续使用新建项目请谨慎选择。本文介绍的内容对存量一体化项目仍然完全适用新项目选型时建议知悉这一现状。第一步定义数据库 Schema以 SQLite 为例官方示例基于 SQLite 数据库Schema 中定义了两个相互关联的模型User用户与Post文章。model User { id Int id default(autoincrement()) email String unique name String? posts Post[] } model Post { id Int id default(autoincrement()) createdAt DateTime default(now()) updatedAt DateTime updatedAt title String content String? published Boolean default(false) viewCount Int default(0) author User? relation(fields: [authorId], references: [id]) authorId Int? }这个 Schema 覆盖了 Prisma 建模的几类典型语法逐个拆解语法模型含义id default(autoincrement())User.id/Post.id主键自增默认从 1 开始uniqueUser.email唯一索引注册时保证邮箱不重复String?/Int?User.name/Post.content/authorId可空字段对应数据库中的 NULLdefault(now())Post.createdAt创建时间默认取当前时间updatedAtPost.updatedAt每次更新记录自动刷新default(false)/default(0)Post.published/Post.viewCount布尔与整数默认值posts Post[]User一对多关系的多侧集合relation(fields: [authorId], references: [id])Post.author外键关系Post.authorId引用User.id可以看到User与Post构成典型的一对多关系一个用户可以拥有多篇文章一篇文章可关联一个作者authorId可空即允许匿名或未关联作者的文章。SQLite 也是本仓库测试与基准环境中实际使用的数据库在 benchmark/fixtures/midway-request-scope/package.json 中可以看到sqlite3: 5.0.2依赖benchmark/fixtures/midway-request-scope/src/entity/user.ts 则展示了使用 TypeORM 描述User实体的写法而benchmark/fixtures目录下还直接存放了user.sqlite3数据库文件。这印证了 SQLite 在 Midway 生态的基准/测试环境中是常见且被充分验证的选择。具体的数据库连接配置与初始数据填充步骤官方文档将其完整收录在hooks-prisma-starter示例的说明文档中读者可结合该示例工程完成datasource指向 SQLite 文件、执行迁移并灌入种子数据等初始化工作。第二步初始化 Prisma Client在 src/api 下创建 Client 单例在 Midway Hooks 一体化项目中后端接口代码默认位于src/api目录全栈应用下midway.config.ts的source默认为./src/api参见 site/docs/hooks/config.md。在此目录下新建prisma.ts用如下代码初始化并导出 Client// src/api/prisma.ts import { PrismaClient } from prisma/client; export const prisma new PrismaClient();需要先完成 Prisma 的常规初始化流程安装prisma与prisma/client依赖按 Prisma 官方流程执行客户端生成prisma generate并完成建库迁移或db push此后prisma/client就会根据你的schema.prisma生成对应的类型与查询 API。从工程实践角度看将 Client 以模块级单例导出是推荐做法PrismaClient内部维护数据库连接池若在多个接口文件中反复new PrismaClient()会造成连接资源浪费而单例导出能保证整个应用复用同一份连接。使用代理镜像加速引擎下载Prisma 在安装时会根据当前平台动态下载其查询引擎等可执行文件。如果你的网络环境不佳例如访问国外二进制源不稳定可以通过环境变量指定镜像地址PRISMA_ENGINES_MIRRORhttps://registry.npmmirror.com/-/binary/prisma/该环境变量需要在执行依赖安装与客户端生成的终端环境中设置即npm install或prisma generate运行时生效设置后引擎二进制将从 npmmirror 的 Prisma 二进制镜像下载显著提升安装成功率与速度。官方文档同时将这一需求对应到了镜像仓库的相关 Issue 记录中属于社区实践中被验证过的常规解法。第三步查询数据——获取所有已发布文章后端接口Get 触发器 findMany以获取所有已发布的文章为例通过生成的 Prisma Client一个接口只需几行代码// src/api/feeds.ts import { Api, Get, } from midwayjs/hooks; import { prisma } from ./prisma; export default Api(Get(), async () { const posts await prisma.post.findMany({ where: { published: true }, include: { author: true }, }); return posts; });代码中的关键点Api()定义接口函数来自midwayjs/hooksGet()指定 HTTP 触发器为 GET。未传path时接口路径由函数名 文件名自动生成默认带有/api前缀详见 site/docs/hooks/api.md 中的路由说明本例即/api/feedsprisma.post.findMany(...)查询条件where: { published: true }只取已发布文章include: { author: true }会同时联查出每篇文章的作者信息利用第一步 Schema 中定义的关系返回结果具备完整的 TypeScript 类型推导。前端一体化调用在后端或前端代码中直接导入该接口函数并调用即零 Api的一体化调用方式import fetchFeeds from ../api/feeds; fetchFeeds().then((feeds) { console.log(feeds); });由于一体化方案会自动生成类型化的请求客户端仓库中tutorial/templates/function模板展示了midwayjs/web-bridge的createClient用法见 tutorial/templates/function/src/web/api/client.ts这里feeds的类型与后端findMany的返回类型完全一致前后端之间不需要手写任何 Ajax 胶水层。手动 HTTP 调用方式若需脱离一体化调用、以普通 HTTP 方式访问直接请求自动生成的路径即可fetch(/api/feeds) .then((res) res.json()) .then((feeds) console.log(feeds));第四步写入数据——注册接口与参数校验官方示例以注册登录场景展示写入操作。基于一体化调用 Prisma 生成的客户端一个包含前端类型提示、后端参数校验、数据库操作的注册接口可以在极少的代码中完成// src/api/feeds.ts import { Api, Post, Validate, } from midwayjs/hooks; import { z } from zod; import { prisma } from ./prisma; export const signUp Api( Post(), Validate( z.string(), z.string().email() ), async ( name: string, email: string ) { const result await prisma.user.create({ data: { name, email, }, }); return result; } );这段代码把三层能力压缩在了同一个函数声明中前端类型提示signUp的参数签名(name: string, email: string)会被一体化调用链完整保留前端书写时即可获得类型提示与静态检查后端参数校验Validate(z.string(), z.string().email())使用 zod 声明校验规则其中z.string()对应name、z.string().email()对应email——Validate传入的 Schema 顺序与用户入参顺序一一匹配参见 site/docs/hooks/validate.md 的说明数据库操作prisma.user.create({ data: { name, email } })完成落库返回值同样带类型。校验失败时的错误处理细节当入参不合法例如邮箱格式错误时接口会返回 HTTP 422 状态码。在调用侧通过try/catch即可捕获错误对象的结构在 site/docs/hooks/validate.md 中有完整说明try { // 调用接口 } catch (error) { console.log(error.data.code); // VALIDATION_FAILED console.log( JSON.parse(error.data.message) ); }其中error.data.message包含完整的 zod 错误信息需要JSON.parse解析解析后的结构大致如下摘自 validate.md[ { code: invalid_type, expected: string, received: number, path: [0, name], message: Expected string, received number, }, ];path数组中的0代表第一个参数校验出错name代表name字段出错。你可以基于这份结构化的错误信息在前端把校验错误精确地展示给用户。一体化调用import { signUp } from ../api/feeds; signUp(John, testtest.com).then( (user) { console.log(user); } );配合第二步的User模型user的返回类型即为创建后的完整用户对象含自增id等字段。类型安全链路在仓库文档中的完整佐证把查询与写入两个例子连起来看正是 site/docs/hooks/intro.md 中描述的完整链路前端基于类型静态校验输入参数并获取类型提示 → 后端校验前端传入参数 → 数据库等业务逻辑使用正确的数据。Prisma 在其中承担了最后一环——数据库层。围绕这条链路仓库内的相关文档还能提供以下配套能力请求上下文如需在接口中读取请求方法、路径、Query、Header 等可通过useContext()获取底层框架的 Context 对象参见 site/docs/hooks/builtin-hooks.md请求客户端配置一体化调用默认基于midwayjs/rpc可通过setupHttpClient配置baseURL、withCredentials、自定义fetcher与middleware统一错误处理等参见 site/docs/hooks/client.md全栈开发命令一体化项目通过hooks dev启动开发、hooks build构建产物、hooks start启动生产服务参见 site/docs/hooks/fullstack.md文件系统路由若希望按目录结构自动生成路由如src/api/feeds.ts对应/api/feeds可在midway.config.ts中启用routes配置参见 site/docs/hooks/file-route.md接口测试接口写好后可借助midwayjs/mock的createApp/createHttpRequest与getApiTrigger进行自动化测试参见 site/docs/hooks/test.md部署一体化应用的三种部署模式同机托管、静态资源上 CDN、前后端完全分离参见 site/docs/hooks/deploy.md。更多示例与深入学习本文对应的中文文档为 site/docs/hooks/prisma.md英文版位于 site/i18n/en/docusaurus-plugin-content-docs/current/hooks/prisma.md接口开发路由、请求参数、响应控制的完整说明见 site/docs/hooks/api.md参数校验Validate/ValidateHttp、zod 类型推导的完整说明见 site/docs/hooks/validate.md关于 Prisma 更全面的用法如分页、聚合、事务、嵌套写入等建议继续查阅 Prisma 官方文档。小结在 Midway Hooks 中接入 Prisma本质上是把零 Api 类型安全的一体化开发体验延伸到数据层schema.prisma定义模型与关系生成的 Prisma Client 提供完全类型化的查询与写入 APIApi()Get()/Post()触发器将其暴露为 HTTP 接口Validate()配合 zod 补齐运行时校验前端则通过一体化调用获得端到端的类型提示。四个环节环环相扣最终落成官方示例中几行代码完成注册登录的开发体验——这正是 Midway Hooks 推荐 Prisma 的原因所在。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Midway Hooks 集成 Prisma ORM 实战从 Schema 定义到一体化类型安全调用Midway Hooks 集成 Prisma ORM 实战从 Schema 定义到一体化类型安全调用 Midway Hooks 的全栈开发模式下数据库层是类后端微服务云原生create-t3-app 中的 Prisma 集成指南从数据库 Schema 到类型安全 Client 的完整实践create t3 app 中的 Prisma 集成指南从数据库 Schema 到类型安全 Client 的完整实践 Prisma 是 create t3 a开发工具CLI代码生成Midway Hooks 一体化全栈方案实战指南零 Api、类型安全与全栈套件Midway Hooks 一体化全栈方案实战指南零 Api、类型安全与全栈套件 Midway Hooks 一体化方案Integrated Solution后端微服务云原生上一篇如何通过Serilog自定义DestructuringPolicy实现复杂对象的智能日志序列化 下一篇HsMod终极指南如何3分钟安装炉石传说模改插件提升游戏体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考