ARTICLE DETAIL

资讯详情

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

TanStack Solid Start 数据库集成指南:通过 Server Functions 与 Server Routes 接入任意数据库

TanStack Solid Start 数据库集成指南:通过 Server Functions 与 Server Routes 接入任意数据库 TanStack Solid Start 数据库集成指南通过 Server Functions 与 Server Routes 接入任意数据库【免费下载链接】router A client-first, server-capable, fully type-safe router and full-stack framework for the web (React and more).项目地址: https://gitcode.com/GitHub_Trending/ro/router导读数据库是任何动态应用的数据核心。TanStack Solid Start即tanstack/solid-start本身不绑定任何数据库而是通过全栈 API——Server Functions 与 Server Routes——将任意数据库的客户端/驱动/服务无缝接入应用的数据层。读完本文你将掌握在 Solid Start 中读写数据库的标准姿势、官方推荐的数据库提供商Neon、Convex、Prisma Postgres及其能力差异并能对照仓库中的真实示例start-basic-auth、start-convex-better-auth落地自己的数据层。说明本仓库中 docs/start/framework/solid/guide/databases.md 通过 frontmatterref引用并替换将tanstack/react-start替换为tanstack/solid-start、React替换为SolidJS得到正文本文以该文档为主体骨架并结合仓库源码与示例进行深度展开。该选择哪种数据库TanStack Solid Start 的设计目标是与任何数据库提供商协作。无论你偏好 SQL、NoSQL 还是其他类型的数据库只要该数据库能通过官方或社区提供的 adapter/client/driver/service 被调用就能集成进 Solid Start 应用。这一不挑食的特性来源于 Solid Start 的架构定位它是一个 client-first、server-capable 的全栈框架数据访问发生在服务端Server Functions / Server Routes 中框架本身不维护任何数据层的持久化状态因此数据库选型完全取决于你的业务场景已有团队熟悉的技术栈如 PostgreSQL Prisma可以直接沿用需要无服务器弹性伸缩的应用可考虑 Serverless Postgres 或托管平台需要实时同步、声明式数据模型的应用可考虑 Convex 这类实时数据库平台。在 Solid Start 中使用数据库有多简单使用数据库的复杂度被压缩为一步在 Server Function 或 Server Route 中调用数据库的 adapter/client/driver/service 即可。框架不限制你调用数据库的方式也不要求你学习新的查询语言。文档给出了一个抽象示例以下代码已按 Solid 语境替换import { createServerFn } from tanstack/solid-start const db createMyDatabaseClient() export const getUser createServerFn().handler(async ({ context }) { const user await db.getUser(context.userId) return user }) export const createUser createServerFn({ method: POST }).handler( async ({ data }) { const user await db.createUser(data) return user }, )这个示例虽然是抽象示意但它精确传达了核心观点只要能从 Server Function 或 Server Route 调用某个数据库Solid Start 就支持它。createServerFn在 packages/start-client-core/src/createServerFn.ts 中实现由 packages/solid-start/src/index.ts 通过export { createServerFn } from tanstack/start-client-core对外暴露。关键参数说明从 createServerFn.ts 的ServerFnOptions类型定义 可以看到createServerFn支持的选项参数类型默认值说明methodMethod如GET、POSTGET该 Server Function 通过 HTTP 暴露时使用的请求方法。从 源码第 84-86 行 可见未显式传入时会被设为GET。读操作通常用GET写操作如创建用户、更新数据建议显式使用POSTstrictboolean \| { input?: boolean; output?: boolean }true是否对输入/输出做序列化校验。默认对输入和输出都启用严格校验见 ServerFnStrictInput/ServerFnStrictOutput 类型此外createServerFn还支持链式调用.validator(...)进行输入校验、.middleware(...)挂载中间件源码第 100-120 行 展示了 middleware 的合并逻辑这些能力在你封装数据库访问时非常实用。为什么数据访问必须放在服务端Solid Start 提供了 code-execution-patterns 所述的分环境执行原语。数据库凭据、连接串如DATABASE_URL属于服务端机密必须通过 Server Function 或createServerOnlyFn访问绝不能直接放进客户端 bundle。从 源码 的机制看Server Function 在客户端被编译为 RPC 调用经由 useServerFn.ts 派发而 handler 只在服务端执行天然隔离了数据库凭据。推荐的数据库提供商虽然 Solid Start 与任意数据库兼容文档建议优先考虑经过 TanStack 官方筛选的合作伙伴提供商Neon与Convex。它们经过了 TanStack 在质量、开放性与性能标准上的审核两者都是优秀的选择。仓库中还额外提供了第三个合作伙伴 Prisma Postgres 的介绍。Neon托管的 Serverless PostgreSQLNeon 是一个完全托管的 Serverless PostgreSQL提供慷慨的免费额度。它通过存储与计算分离的架构实现自动扩缩容、数据库分支branching与无底存储bottomless storage。它让开发者同时获得 PostgreSQL 的全部能力与现代云能力非常适合 Solid Start 应用。核心特性Serverless PostgreSQL自动伸缩计算资源按需扩缩无需预先规划容量数据库分支Branching为开发与测试环境创建分支类似于 Git 的分支模型内置连接池Connection Pooling解决 Serverless 场景下连接数受限的问题时间点恢复Point-in-time Restore可回滚到任意历史时间点基于 Web 的 SQL 编辑器无需本地安装客户端即可查询无底存储Bottomless Storage存储与计算分离后存储成本与扩展性大幅优化。Convex实时、事务性的 Serverless 数据后端Convex 是一个强大的 Serverless 数据库平台让开发者无需手动管理数据库服务器、也无需编写复杂查询即可构建全栈应用。它提供实时、可伸缩、事务性的数据后端与 Solid Start 无缝集成。Convex 的声明式数据模型与自动冲突解决机制确保应用即使在规模扩张时也能保持一致与响应。它面向开发者的易用性设计聚焦于简洁与生产力。仓库中的 start-convex-better-auth 示例展示了 Convex 与 Better Auth 的完整集成其 README 给出了可复制的启动流程# 复制环境变量文件后 pnpm i pnpx convex dev # 启动 Convex 本地开发环境占用一个终端 pnpx convex env set SITE_URL http://localhost:3000/ pnpx convex env set BETTER_AUTH_SECRET$(openssl rand -base64 32) pnpx convex dev # 再次运行以应用环境变量 # 另开一个终端 pnpm run devPrisma Postgres即开即用的生产级 PostgresPrisma Postgres 的口号是Instant Postgres, Zero Setup——数秒内获得一个生产可用的 Postgres 数据库然后立即回到编码。连接、扩缩容与调优都由平台处理。Edge 优化本地区域路由带来更低延迟与更少跳数即使复杂查询也只需一次快速往返适配你的技术栈与既有框架、库和工具协同保持顺滑的开发体验Web UI托管界面方便团队检查、管理并查询数据自动扩缩容从零用户增长到数百万用户无需冷启动或手动调优Unikernel 隔离每个数据库以独立的 unikernel 运行兼顾安全、速度与效率。源码级实战用 Prisma SQLite 实现注册/登录理解原理之后最有说服力的证据是仓库中的真实示例。examples/solid/start-basic-auth是一个完整的 Solid Start Prisma 鉴权示例展示了在 Server Function 中读写数据库的完整链路。1. 定义数据模型prisma/schema.prisma 定义了User模型generator client { provider prisma-client output ../src/prisma-generated } datasource db { provider sqlite } model User { email String id unique password String }注意这里通过output将生成的 Prisma Client 输出到src/prisma-generated供应用内直接导入。2. 初始化数据库客户端src/utils/prisma.ts 通过 Prisma 的prisma/adapter-libsql驱动创建客户端并支持通过环境变量DATABASE_URL覆盖数据库地址import { PrismaLibSql } from prisma/adapter-libsql import { PrismaClient } from ../prisma-generated/client const adapter new PrismaLibSql({ url: process.env.DATABASE_URL || file:./prisma/dev.db, }) export const prismaClient new PrismaClient({ adapter })这种模块顶层创建单例客户端的模式在 Server Function 中被复用避免了每次请求都重新创建连接。3. 在 Server Function 中读写数据库src/routes/signup.tsx 将数据库读写封装在createServerFn({ method: POST })中import { createFileRoute, redirect } from tanstack/solid-router import { createServerFn, useServerFn } from tanstack/solid-start import { hashPassword, prismaClient } from ~/utils/prisma export const signupFn createServerFn({ method: POST }) .validator( (d: { email: string; password: string; redirectUrl?: string }) d, ) .handler(async ({ data }) { // 检查用户是否已存在 const found await prismaClient.user.findUnique({ where: { email: data.email }, }) // 加密密码 const password await hashPassword(data.password) // 创建会话 const session await useAppSession() if (found) { if (found.password ! password) { return { error: true, userExists: true, message: User already exists } } await session.update({ userEmail: found.email }) throw redirect({ href: data.redirectUrl || / }) } // 创建用户 const user await prismaClient.user.create({ data: { email: data.email, password }, }) await session.update({ userEmail: user.email }) throw redirect({ href: data.redirectUrl || / }) })这个示例揭示了数据库集成的几个要点.validator()校验输入在数据进入数据库前先做类型与结构校验对应 createServerFn.ts 中 validator 的合并逻辑method: POST用于写操作避免写操作通过 GET 暴露数据库调用与业务逻辑内聚查询、加密、会话更新、重定向都在 handler 内完成客户端只通过useServerFn触发 RPCredirect直接 throw这是 TanStack Router/Solid Router 的惯用导航方式。类似的数据库查询还出现在 _authed.tsxprismaClient.user.findUnique加载当前用户与 src/utils/posts.tsServer Function 封装外部 API 读取展示从 Server Function 调用任意服务的通用模式。4. 会话与数据库联动src/utils/session.ts 展示了基于 Cookie 的会话如何与数据库中的用户信息联动import { useSession } from tanstack/solid-start/server type SessionUser { userEmail: User[email] } export function useAppSession() { return useSessionSessionUser({ password: ChangeThisBeforeShippingToProdOrYouWillBeFired, }) }登录成功后仅把userEmail写入会话需要用户详情时再通过 Server Function 查询数据库——这是典型的会话存标识、数据库存数据分层。文档与 API 现状文档末尾明确指出更多数据库与 Solid Start 集成的详细文档即将推出。在那之前官方建议持续关注仓库中的示例与指南以充分利用应用的数据层。当前仓库已经提供了丰富的落地参考examples/solid/start-basic-authPrisma SQLite Server Functions 的完整鉴权示例examples/solid/start-convex-better-authConvex Better Auth 集成示例docs/start/framework/solid/guide/server-functions.mdServer Functions 深度指南docs/start/framework/solid/guide/server-routes.mdServer Routes 指南docs/start/framework/solid/guide/execution-model.md执行模型服务端/客户端/同构代码的边界docs/start/framework/solid/guide/environment-variables.md环境变量DATABASE_URL等凭据的安全管理。总结TanStack Solid Start 的数据库集成哲学可以概括为一句话框架不替你选数据库也不替你管连接只负责把数据访问放进服务端安全边界内。实践路径清晰选择你熟悉的数据库及其 driver/adapter/client在服务端模块中创建客户端单例参考 src/utils/prisma.ts用createServerFn封装读写逻辑读操作GET、写操作POST配合.validator()与strict校验保证输入安全在路由 loader 或组件中通过useServerFn调用数据经 RPC 传输凭据始终留在服务端。无论是自托管 PostgreSQL、Neon 的 Serverless Postgres还是 Convex 的实时数据后端都能以相同的接入方式为 Solid Start 应用提供数据能力。【免费下载链接】router A client-first, server-capable, fully type-safe router and full-stack framework for the web (React and more).项目地址: https://gitcode.com/GitHub_Trending/ro/router创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表