You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase RLS违规时如何获取错误以阻止误删文件?

解决Supabase RLS阻止删除时误删关联文件的问题

Supabase的RLS规则阻止删除操作时,不会返回error对象(因为RLS是过滤行而非抛出错误),只会返回空的删除结果,这就是你遇到脚本误删文件的原因。要解决这个问题,你需要主动检查是否有行被实际删除,再执行文件删除操作。

具体实现方案

方案1:通过返回被删除的行判断

在delete请求后添加.select(),获取被删除的行数据,通过判断行数量确认删除是否成功:

// 从数据库中删除文件记录并返回被删除的行
const { data: deletedRows, error: deleteError } = await supabase
  .from('files')
  .delete()
  .eq('id', fileId)
  .select(); // 关键:添加select获取删除结果

// 先处理请求本身的错误(比如网络错误、SQL语法错误)
if (deleteError) throw deleteError;

// 检查是否有行被实际删除(RLS阻止时deletedRows为空数组)
if (deletedRows.length === 0) {
  throw new Error('无权限删除该记录或记录不存在');
}

// 确认删除成功后,再删除R2中的文件
await context.env.MY_BUCKET.delete(fileData.r2_object_name);

方案2:通过计数判断

使用.count('exact')获取被删除的行数,更直接地判断删除是否生效:

// 从数据库中删除文件记录并获取删除行数
const { count, error: deleteError } = await supabase
  .from('files')
  .delete()
  .eq('id', fileId)
  .count('exact'); // 关键:添加count获取删除行数

if (deleteError) throw deleteError;

// 计数为0说明没有行被删除(RLS阻止或记录不存在)
if (count === 0) {
  throw new Error('删除操作未生效:无权限或记录不存在');
}

// 执行文件删除
await context.env.MY_BUCKET.delete(fileData.r2_object_name);

额外注意点

  • 你原代码中console.log("Errs", deleterror);的变量名写错了,应该是deleteError(注意大小写),否则会抛出未定义错误。
  • 如果需要区分“记录不存在”和“RLS权限不足”,可以在RLS规则中添加自定义错误信息,或者通过Supabase的日志进一步排查,但业务层面通常统一处理为“无法删除”即可。

内容的提问来源于stack exchange,提问作者Rabot Snek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:44:58