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