ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

open-saas RESTful API 设计全解析:免费 SaaS 启动模板前后端集成实战

open-saas RESTful API 设计全解析:免费 SaaS 启动模板前后端集成实战 open-saas RESTful API 设计全解析免费 SaaS 启动模板前后端集成实战【免费下载链接】open-saasA 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing page, Payments (Stripe, Polar.sh), Shadcn UI, S3 file upload. AI-ready with tailored AGENTS.md, skills, and Claude Code plugin. One cmd deploy. Powered by Wasp full-stack framework.项目地址: https://gitcode.com/GitHub_Trending/op/open-saas自建 API 最磨人的从来不是写路由而是校验逻辑、权限判断、错误格式各写各的越往后越难收口。open-saas 是一套基于 React Node.js 的免费开源 SaaS 启动模板Wasp Prisma它的 RESTful API 设计把这些脏活统一收敛在了几层薄薄的约定里输入一律 Zod 校验权限一律看context.user错误一律抛HttpError。读懂这套约定你拿到的不只是一个模板而是一份可以直接套用的后端规范。分层如何保证类型安全与 API 权限控制open-saas 的每个业务模块用户、支付、文件上传都是同一个三件套结构xxx.wasp.ts声明 operationoperations.ts写实现env.ts管配置。实现层内部再分两段——先用 Zod schema 把入参钉死成具体类型再访问context.user做权限判断最后才允许触碰 Prisma。这种校验 → 鉴权 → 数据访问的固定顺序带来两个直接收益。类型安全上前端调用api.payment.generateCheckoutSession时参数和返回值都由 TypeScript 推导改后端字段编译期就会报错不存在文档说返回 A实际返回 B的情况。API 权限控制上像 user/operations.ts 里的updateIsUserAdminById任何非管理员请求都会在碰数据库之前被 403 拦下if (!context.user) throw new HttpError(401, Only authenticated users ...); if (!context.user.isAdmin) throw new HttpError(403, Only admins are allowed to perform this operation);统一响应靠HttpError兜底401 未登录、403 越权、404 资源不存在文件上传模块查 S3 时就会抛 404前端不需要为每个接口写特殊分支。跟着一次订阅支付调用看用户、支付、文件三类接口协作拿用户订阅 Pro 计划这个场景走一遍能看清三类接口的协作关系。第一步选计划。定价页展示的计划列表来自 payment/plans.ts 里的paymentPlans映射键是PaymentPlanId枚举Hobby / Pro / Credits10值是订阅或充值积分两种效果类型。计划 id 是纯共享类型前端按钮直接传枚举值没有魔法字符串。第二步开结账会话。前端调api.payment.generateCheckoutSession(planId)。服务端先验登录态再校验该用户有 email无 email 直接 403然后交给paymentProcessor.createCheckoutSession。注意这里处理器是接口隔离的Stripe、Lemon Squeezy、Polar 三家实现同一个PaymentProcessor接口切换只需改一行导出operation 代码零改动。第三步webhook 回写。支付完成后由 Stripe webhook 更新用户的subscriptionStatusSubscriptionStatus枚举同样定义在 plans.ts。管理员在后台调getPaginatedUsers时就能按订阅状态筛出这批用户——分页、过滤、排序都在 Zod schema 里声明完毕。第四步业务里用文件接口。若产品需要用户上传头像或资料走 file-upload/operations.tscreateFileUploadUrl发预签名 URL 让浏览器直传 S3addFileToDb落库前会checkFileExistsInS3防止脏记录deleteFile则先删库再删 S3删 S3 失败只记日志不阻塞避免用户卡死在删除动作上。一次订阅链路里用户模块负责你是谁、能做什么支付模块负责钱和状态文件模块负责东西放哪模块之间只通过共享类型和 webhook 通信没有互相 import 的实现细节。前后端集成调用封装、错误处理与类型共享的三件要事调用封装用 React Query 而不是裸 fetch。定价页的典型写法const { data: paymentPlans } useQuery({ queryKey: [paymentPlans], queryFn: api.payment.getPlans, });Wasp 生成的api客户端本身就是类型安全的缓存、重试、loading 状态交给 React Query。容易踩的坑是把 mutation 也塞进 useQuery 里轮询——支付结果应以导航到CheckoutResultPage后的一次查询为准别自己猜。错误统一处理只认HttpError的 status。后端所有失败都是HttpError前端在 mutation 的 catch 里按 401跳登录、403提示无权限、其他toast 兜底文案三类分发即可。反面教材是拿error.message直接显示给用户——那是给开发看的英文不是产品文案。类型共享让计划 id这种值走枚举。上面PaymentPlanId枚举就是范例新增一个计划时改一处枚举前后端所有引用点编译期联动。坑在于有人图省事在共享目录再手抄一份类型——两份类型漂移一次bug 就来了。三步启动 open-saas 的 API 服务克隆并安装依赖git clone https://gitcode.com/GitHub_Trending/op/open-saas cd open-saas/template/app npm install起数据库wasp start db保持运行首次启动再执行wasp db migrate-dev建表。起应用wasp start浏览器打开本地地址登录、支付、上传三类接口即刻可用。模板要求.env.client/.env.server已填好开发值支付相关的 key 见src/payment/stripe/env.ts注释说明。社区迭代与延伸阅读这套 API 结构仍在快速演进最近合并的 PR 包括移除冗余的checkoutSessionId字段、给模板补齐 404 页面、收紧文件上传的类型白名单——都是围绕校验更早、状态更瘦、错误更明确三个方向。想深入具体子系统可以直接看仓库内文档authentication 指南、tests 指南 同级的 e2e 测试以及template/app/AGENTS.md里给 AI 编码助手的项目约定。【免费下载链接】open-saasA 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing page, Payments (Stripe, Polar.sh), Shadcn UI, S3 file upload. AI-ready with tailored AGENTS.md, skills, and Claude Code plugin. One cmd deploy. Powered by Wasp full-stack framework.项目地址: https://gitcode.com/GitHub_Trending/op/open-saas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表