Electron+React项目中Supabase插入todos表数据返回空对象且数据未写入
嘿,我之前也碰到过类似的情况,这种返回空对象但没报错、数据也没写入的问题,大概率是权限或者代码逻辑的小疏漏,咱们一步步来排查:
首先重点检查表权限和行级安全(RLS):
你的todos表设置了user_id关联auth.users,而且是NOT NULL约束,但Supabase默认新建的表,authenticated用户是没有插入权限的;如果开启了RLS(这是Supabase的安全最佳实践),还得有对应的策略允许用户操作自己的数据。
- 先去Supabase控制台的「表编辑器」找到todos表,切换到「权限」标签,确认authenticated角色拥有INSERT权限;
- 如果已经开启RLS,必须添加一条允许用户插入自己待办的策略,执行这条SQL即可:
CREATE POLICY "用户只能插入自己的待办" ON public.todos FOR INSERT TO authenticated WITH CHECK (auth.uid() = user_id);
这条策略能确保只有登录用户能插入属于自己的todo,和你的表结构完全匹配。
然后核对代码里的插入逻辑:
你有没有在插入时正确传递user_id?因为表的user_id是必填项,而且如果有RLS策略,必须和当前登录用户的id一致。参考示例写法:
// 先确认当前用户已登录 const { data: { user } } = await supabase.auth.getUser(); if (!user) { console.log("用户未登录,无法插入待办"); return; } // 执行插入操作 const { data, error } = await supabase .from('todos') .insert({ item: "你的待办内容", user_id: user.id // 这个字段绝对不能忘! }); // 一定要同时打印data和error! console.log("插入结果:", data, "错误信息:", error);
很多时候大家会忘了传user_id,或者没先验证用户登录状态,导致插入失败但没拿到错误提示。
还有Electron环境的特殊适配:
确保你在Electron+React项目里正确初始化了Supabase,比如.env文件里的SUPABASE_URL和SUPABASE_ANON_KEY配置无误,初始化客户端的代码也没问题:
import { createClient } from '@supabase/supabase-js'; const supabase = createClient( import.meta.env.VITE_SUPABASE_URL, import.meta.env.VITE_SUPABASE_ANON_KEY );
如果Electron渲染进程开启了nodeIntegration,可能会影响Supabase的请求,你可以试试在createClient时显式指定fetch:
const supabase = createClient( import.meta.env.VITE_SUPABASE_URL, import.meta.env.VITE_SUPABASE_ANON_KEY, { global: { fetch: window.fetch } } );
最后提醒:别忽略error对象!
你说Supabase返回{},可能是你只打印了data,但error对象里其实藏着详细的错误原因(比如权限不足、字段缺失),一定要同时输出error,这是排查问题的核心关键。
备注:内容来源于stack exchange,提问作者Hassan Rehan

