用途
Supabase Expert 是一个针对 Supabase 开发的 AI 技能,使用时用户被设定为资深 Supabase 工程师,目标是在涉及 Supabase、Supabase Auth、Supabase Database、Supabase Storage、Supabase Edge Functions、Supabase Realtime、行级安全(Row Level Security)等任何任务中被触发使用,用于编写生产级 Supabase 代码。
核心原则
- RLS First:每张表都必须启用行级安全,没有例外。
- 类型安全:使用 supabase gen types 从数据库架构生成 TypeScript 类型。
- Edge Functions:服务端逻辑使用基于 Deno 的 Edge Functions,而不是在客户端变通实现。
- Auth 集成:使用 Supabase Auth 并正确管理会话,不要自行实现 JWT。
- Realtime:使用 Supabase Realtime 频道实现实时更新,而不是轮询。
项目设置
在已有项目中初始化 Supabase:
npx supabase init
npx supabase start # Local dev with Docker
npx supabase db push # Push migrations to remote
生成 TypeScript 类型:
npx supabase gen types typescript --local > src/types/database.ts
数据库架构模式
- 启用 RLS:
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; - 用户只能读写自己的数据:为 SELECT/UPDATE 创建使用
auth.uid() = id的策略,UPDATE 同时使用 USING 和 WITH CHECK。 - 软删除模式:为表添加
deleted_at TIMESTAMPTZ DEFAULT NULL,并创建策略隐藏软删除记录(USING (deleted_at IS NULL))。 - 多租户模式:通过查询 org_members 表中
user_id = auth.uid()的 org_id 来隔离文档等数据。
客户端设置(Next.js)
提供浏览器客户端(createBrowserClient)与服务端客户端(createServerClient)的创建方式,使用 @supabase/ssr 包和环境变量 NEXT_PUBLIC_SUPABASE_URL、NEXT_PUBLIC_SUPABASE_ANON_KEY,服务端通过 next/headers 的 cookies 传递会话,并使用生成的 Database 类型。
Edge Functions
示例为 supabase/functions/send-welcome-email/index.ts,使用 Deno 的 serve 与 @supabase/supabase-js,通过 SUPABASE_URL 与 SUPABASE_SERVICE_ROLE_KEY 环境变量创建客户端,从 profiles 表查询用户信息,返回 JSON 响应。代码注释表明可经 Resend/SendGrid 等发送邮件。
Realtime 订阅
- 监听频道中的新消息:使用
supabase.channel(...).on('postgres_changes', ...),可按 schema、table 和 filter(如room_id=eq.1)过滤 INSERT 事件。 - 在线状态(Presence):使用
presence事件与presenceState(),在订阅成功后调用track上报用户信息。
Storage 文件上传
- 上传:
supabase.storage.from('avatars').upload(path, file, { cacheControl, upsert, contentType })。 - 私有 bucket 获取签名 URL:
createSignedUrl。 - 公开 bucket 获取公共 URL:
getPublicUrl。
迁移最佳实践
迁移文件示例(supabase/migrations/20240101000000_create_profiles.sql)包括:
- 创建 profiles 表,主键外键关联
auth.users(id)并设置级联删除。 - 注册时自动创建 profile:用
handle_new_user()函数与on_auth_user_created触发器,从raw_user_meta_data提取 full_name 与 avatar_url。 - updated_at 触发器:
set_updated_at()函数与set_profiles_updated_at触发器,在更新前设置updated_at = now()。
检查清单
- 所有表启用 RLS
- 从架构生成 TypeScript 类型
- Service role key 绝不暴露给客户端
- 敏感操作使用 Edge Functions
- API 路由使用正确的 auth 中间件
- 频繁查询的列建立数据库索引
- 推送前在本地测试迁移
- 配置 Storage bucket 策略
- 组件卸载时清理 Realtime 订阅
限制
资料未说明该技能的收费、定价、支持平台范围或效果保证,相关事实暂未提供。