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

使用Supabase调用RPC存储过程时遭遇404错误求助

解决Supabase RPC调用404及数组追加问题

核心问题定位

你碰到的404错误+数组追加失败,主要是三个关键问题导致的:

  • 前端RPC调用的参数名和存储过程定义的参数名不匹配
  • 存储过程的WHERE条件和你的Users表实际结构不匹配
  • 缺少必要的权限配置

分步修复方案

1. 修正存储过程(适配你的业务结构)

如果你的Users表是通过email字段匹配用户(而非id),重新定义存储过程:

create or replace function append_array(new_element int8, user_email text)
returns void
as
$func$
    update "Users"
    -- 用coalesce处理UserGroups为null的情况,避免报错
    set "UserGroups" = coalesce("UserGroups", '{}') || $1
    where "email" = $2;
$func$
language sql security definer;

注意:如果你的Users表是Supabase Auth自动生成的auth.users表,主键是uuid类型的id,那要把参数user_email改成user_id uuid,WHERE条件改成id = $2,前端传session.user.id即可。

2. 修正前端RPC调用代码

调用RPC时必须和存储过程的参数名完全一致,同时要先拿到新建群组的主键:

async function createGroup() {
    // 插入群组并返回生成的主键
    const { data: groupData, error } = await supabase
    .from('Groups')
    .insert({ Members: [session.user.email], Name: groupName, Editors: [session.user.email] })
    .select()
    .single();

    if(error) {
      alert("Error creating group");
      console.log(error);
      return;
    }

    // 调用RPC追加群组ID到UserGroups数组
    const { error: errorupdate } = await supabase
    .rpc('append_array', {
      new_element: groupData.id, // 用真实生成的群组主键替换测试值
      user_email: session.user.email // 参数名必须和存储过程定义的一致
    });

    if(errorupdate){
      alert("Error updating user info group");
      console.log(errorupdate);
    }
  }

3. 配置权限(关键步骤)

  • 给存储过程添加执行权限:在Supabase SQL编辑器执行
grant execute on function append_array(int8, text) to authenticated;
  • 确保Users表的更新权限:在Supabase控制台「数据库」→「权限」页面,给authenticated角色开启Users表的UPDATE权限,或者单独对UserGroups字段授权。

额外检查点

  • 确认存储过程已创建成功:在Supabase控制台「数据库」→「函数」中能看到append_array
  • 如果UserGroups字段默认不是空数组,必须用coalesce处理null值,否则array_append会直接报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:42:52