122 lines
3.5 KiB
Markdown
122 lines
3.5 KiB
Markdown
# 注册后数据未存储到数据库 - 快速修复指南
|
||
|
||
## 🔍 问题原因
|
||
|
||
当前配置 `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. **验证**
|
||
```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 函数。
|