Files
medical-mall/pages/user/test/QUICK_FIX.md

3.5 KiB
Raw Blame History

注册后数据未存储到数据库 - 快速修复指南

🔍 问题原因

当前配置 ENABLE_EMAIL_AUTOCONFIRM=false,注册后:

  • auth.users 表中会创建用户记录
  • 没有 session不自动登录
  • 没有 token
  • RLS 策略阻止插入 ak_users(因为 auth.uid() 返回 null

解决方案(两种方式)

方式一:使用数据库触发器(推荐,完全自动化)

优点:注册时自动创建 ak_users 记录,无需前端处理

执行步骤

  1. 在 Supabase Dashboard (http://192.168.1.61: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. 验证

    -- 检查触发器是否存在
    SELECT tgname FROM pg_trigger WHERE tgname = 'on_auth_user_created';
    
    -- 检查函数是否存在
    SELECT proname FROM pg_proc WHERE proname = 'handle_new_user';
    
  5. 测试

    • 在前端注册一个新用户
    • 检查 ak_users 表是否有新记录:
    SELECT * FROM ak_users ORDER BY created_at DESC LIMIT 5;
    

方式二:仅使用 RPC 函数(如果触发器无法创建)

执行步骤

  1. 在 Supabase Dashboard 中执行 USER_AUTH_SCHEMA.sql

  2. 验证 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';
    
  3. 测试注册

    • 前端代码会自动调用 upsert_user_profile RPC 函数
    • 检查 ak_users 表是否有新记录

🔧 如果数据仍然没有存储

检查清单

  1. 确认 RPC 函数已创建

    SELECT proname, prosrc FROM pg_proc WHERE proname = 'upsert_user_profile';
    

    如果返回空,说明函数未创建,需要执行 USER_AUTH_SCHEMA.sql

  2. 确认触发器已创建(如果使用了方式一)

    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 函数。