React Native中如何从Supabase默认表获取UserID关联自定义表
解决Supabase注册时获取UserID关联插入user_info表的问题
问题根源
你当前代码里注册后又调用signInWithPassword属于冗余操作——supabase.auth.signUp成功后(未开启邮箱验证的情况下),返回的user对象已经包含用户ID,完全不需要二次登录去获取。
解决方案分两种场景:
场景1:未开启邮箱验证(注册后直接登录)
直接使用signUp返回的user.id即可,删除多余的登录步骤,修改后的代码如下:
const handlesignup = async () => { try { const { user, error } = await supabase.auth.signUp({ email: email, password: password, }); if (error) { console.log('注册错误:', error.message); return; } // 直接使用signUp返回的user.id const userId = user?.id; if (!userId) { console.log('无法获取用户ID'); return; } const { data, error: insertError } = await supabase .from('user_info') .insert([ { name: name, lname: lname, id: userId, }, ]); if (insertError) { console.log('插入数据错误:', insertError.message); return; } console.log('注册成功!'); console.log('用户ID:', userId); } catch (error) { console.log('错误:', error.message); } };
场景2:开启了邮箱验证(需验证后才能登录)
这种情况下signUp返回的user会是null,因为用户还未完成验证。推荐用数据库触发器自动同步数据,不需要前端手动插入:
- 打开Supabase控制台,进入SQL编辑器
- 执行以下触发器脚本:
-- 创建函数,当auth.users新增用户时,自动插入user_info表 CREATE OR REPLACE FUNCTION public.handle_new_user() RETURNS TRIGGER AS $$ BEGIN INSERT INTO public.user_info (id) VALUES (NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- 创建触发器,监听auth.users的插入事件 CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();
这样用户注册后,即使没验证邮箱,数据库也会自动在user_info表插入一条关联用户ID的记录,后续用户补充信息时再更新即可。
如果一定要前端处理,可以监听auth.onAuthStateChange事件,当用户验证邮箱登录后再插入数据:
// 在组件初始化时监听auth状态变化 supabase.auth.onAuthStateChange((event, session) => { if (event === 'SIGNED_IN' && session?.user) { // 这里执行插入user_info的逻辑 const insertUserInfo = async () => { const { error } = await supabase .from('user_info') .insert([{ id: session.user.id, name: name, lname: lname }]); if (error) console.log('插入错误:', error.message); }; insertUserInfo(); } });
内容的提问来源于stack exchange,提问作者Uncle_batty
相关产品推荐
相关产品推荐

