如何移除Supabase路径默认public前缀?解决函数调用报错问题
解决Supabase调用自定义函数时自动添加public前缀的问题
问题分析
你在auth模式下创建了get_mfa_factors函数,但调用时Supabase默认在函数名前拼接public.前缀,导致系统尝试查找不存在的public.auth.get_mfa_factors(实际函数路径为auth.get_mfa_factors),最终抛出找不到函数的错误。
解决方案
1. 调用RPC时显式指定schema
在Next.js的Supabase RPC调用中,通过第三个参数指定函数所在的auth模式,就能避免自动添加public前缀:
const { data: userCredentials, error: credentialsError } = await supabase .rpc('get_mfa_factors', { user_id: user.id }, { schema: 'auth' });
注意这里函数名只需传get_mfa_factors,无需携带auth.前缀,schema参数会帮你指定正确的模式路径。
2. 调整PostgreSQL的search_path(全局生效)
如果不想每次调用都手动指定schema,可以修改数据库的search_path,让PostgreSQL查找对象时优先检索auth模式:
ALTER ROLE authenticated SET search_path TO auth, public;
将authenticated替换为你的实际调用角色(比如服务端调用用service_role)。执行后,后续调用函数时直接写get_mfa_factors,数据库会自动在auth和public模式中依次查找。
3. 验证函数执行权限(额外检查)
确保调用函数的角色拥有auth.get_mfa_factors的执行权限,避免权限问题引发的隐性错误:
GRANT EXECUTE ON FUNCTION auth.get_mfa_factors(uuid) TO authenticated;
根据你的实际业务场景调整目标角色。
验证方法
修改完成后,重新用Postman发送请求或在Next.js中测试调用,确认错误消失且能正常获取数据。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

