3.5 KiB
3.5 KiB
注册后数据未存储到数据库 - 快速修复指南
🔍 问题原因
当前配置 ENABLE_EMAIL_AUTOCONFIRM=false,注册后:
- ✅
auth.users表中会创建用户记录 - ❌ 没有 session(不自动登录)
- ❌ 没有 token
- ❌ RLS 策略阻止插入
ak_users(因为auth.uid()返回 null)
✅ 解决方案(两种方式)
方式一:使用数据库触发器(推荐,完全自动化)
优点:注册时自动创建 ak_users 记录,无需前端处理
执行步骤:
-
在 Supabase Dashboard (http://192.168.1.61:3000) 中打开 SQL Editor
-
执行
USER_AUTH_SCHEMA.sql- 创建
ak_users表和 RLS 策略 - 创建
upsert_user_profileRPC 函数
- 创建
-
执行
USER_AUTH_TRIGGER.sql- 创建触发器,在
auth.users插入时自动创建ak_users记录
- 创建触发器,在
-
验证
-- 检查触发器是否存在 SELECT tgname FROM pg_trigger WHERE tgname = 'on_auth_user_created'; -- 检查函数是否存在 SELECT proname FROM pg_proc WHERE proname = 'handle_new_user'; -
测试
- 在前端注册一个新用户
- 检查
ak_users表是否有新记录:
SELECT * FROM ak_users ORDER BY created_at DESC LIMIT 5;
方式二:仅使用 RPC 函数(如果触发器无法创建)
执行步骤:
-
在 Supabase Dashboard 中执行
USER_AUTH_SCHEMA.sql -
验证 RPC 函数
-- 检查函数是否存在 SELECT proname FROM pg_proc WHERE proname = 'upsert_user_profile'; -- 检查权限 SELECT grantee, privilege_type FROM information_schema.routine_privileges WHERE routine_name = 'upsert_user_profile'; -
测试注册
- 前端代码会自动调用
upsert_user_profileRPC 函数 - 检查
ak_users表是否有新记录
- 前端代码会自动调用
🔧 如果数据仍然没有存储
检查清单
-
确认 RPC 函数已创建
SELECT proname, prosrc FROM pg_proc WHERE proname = 'upsert_user_profile';如果返回空,说明函数未创建,需要执行
USER_AUTH_SCHEMA.sql -
确认触发器已创建(如果使用了方式一)
SELECT tgname, tgenabled FROM pg_trigger WHERE tgname = 'on_auth_user_created';如果返回空,需要执行
USER_AUTH_TRIGGER.sql -
检查浏览器控制台
- 打开浏览器开发者工具
- 查看 Console 标签
- 注册时应该看到:
注册返回结果: {...}✅ 用户资料创建成功: ...或⚠️ 用户资料创建失败
-
检查 RPC 调用错误
- 如果看到
RPC 创建用户资料失败,检查:- RPC 函数是否存在
- 函数参数是否正确
- 网络请求是否成功
- 如果看到
📝 当前代码逻辑
注册流程:
- 调用
supa.signUp()→ 在auth.users中创建用户 - 获取
user对象 - 调用
ensureUserProfile(user)→ 内部调用upsert_user_profileRPC 函数 - RPC 函数使用
SECURITY DEFINER→ 绕过 RLS,创建ak_users记录
如果 RPC 函数不存在,会回退到直接插入,但会失败(因为 RLS 阻止)。
🎯 推荐操作
立即执行:
- 在 Supabase Dashboard 执行
pages/user/test/USER_AUTH_SCHEMA.sql - 在 Supabase Dashboard 执行
pages/user/test/USER_AUTH_TRIGGER.sql - 测试注册功能
- 检查
ak_users表是否有新记录
如果触发器创建失败(权限问题),只执行 USER_AUTH_SCHEMA.sql 也可以,前端会使用 RPC 函数。