You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Expo应用调用Supabase查询出现404错误,请求排查原因

问题排查:Supabase查询无法正常工作(React Native Expo)

问题背景

已完成Supabase登录,但所有针对practitioners表的查询均无法返回数据。当前相关配置如下:

表RLS策略

alter policy "anyone can view practitioners"
on "public"."practitioners"
to anon, authenticated
using (
  true
);

Supabase连接代码

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    storage: AsyncStorage,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: false,
  },
});

查询函数代码

async function getList() {
    try {
        setLoading(true);

        const { data, error, status } = await supabase
        .from("practitioners")
        .select(
            `therapy_location,
            business_address,
            practitioner_id,
            practitioner_title,
            practitioner_type,
            practitioner_location,
            auth_user_id,
            practitioner_email,
            practitioner_personal_name,
            practitioner_family_name`
        )
        .ilike('practitioner_personal_name', params.params)
        .or(`practitioner_family_name.ilike.${params.params}`)
        .or(`practitioner_location.ilike.${params.params}`)
        if (error && status !== 406) {
            throw error;
        }

        if (data) {
            setData(data);
        }
    } catch (error) {
        if (error instanceof Error) {
            Alert.alert(error.message);
        }
    } finally {
        setLoading(false);
    }
}

问题排查与修复方案

1. 查询语句写法错误(核心问题)

你的or条件使用逻辑完全不符合Supabase的语法规范:

  • 多个or条件需要合并在同一个.or()调用中,而非多次调用
  • ilike模糊查询必须搭配通配符%才能生效
  • 直接拼接参数到查询字符串中会导致语法错误,还存在SQL注入风险

修复后的查询代码

const { data, error, status } = await supabase
.from("practitioners")
.select(`
    therapy_location,
    business_address,
    practitioner_id,
    practitioner_title,
    practitioner_type,
    practitioner_location,
    auth_user_id,
    practitioner_email,
    practitioner_personal_name,
    practitioner_family_name
`)
// 合并or条件,添加通配符,使用参数占位符避免拼接风险
.or(`
    practitioner_personal_name.ilike.%$1%,
    practitioner_family_name.ilike.%$1%,
    practitioner_location.ilike.%$1%
`, { params: [params.params] })

如果params.params本身已经包含%通配符,可移除代码中的%

2. RLS策略验证

虽然你的策略逻辑上允许所有用户访问,但需要确认两个关键点:

  • 表的行级安全(RLS)是否已启用:执行ALTER TABLE practitioners ENABLE ROW LEVEL SECURITY;
  • 策略是否实际生效:在Supabase控制台的SQL编辑器中,切换到anonauthenticated角色,执行SELECT * FROM practitioners;测试能否返回数据

3. 其他潜在问题排查

  • 会话有效性:登录后调用supabase.auth.session(),确认返回有效会话对象,空会话会导致查询使用anon角色,若策略配置异常则无法返回数据
  • 字段名一致性:确认数据库中字段名与查询中的完全匹配(PostgreSQL默认区分大小写)
  • 错误处理逻辑:当前代码忽略了status === 406的错误,建议移除该判断,直接抛出所有错误以便排查问题
  • 网络环境:检查设备是否能正常访问Supabase实例地址,排除防火墙或代理拦截的可能

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

火山引擎 最新活动