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编辑器中,切换到
anon或authenticated角色,执行SELECT * FROM practitioners;测试能否返回数据
3. 其他潜在问题排查
- 会话有效性:登录后调用
supabase.auth.session(),确认返回有效会话对象,空会话会导致查询使用anon角色,若策略配置异常则无法返回数据 - 字段名一致性:确认数据库中字段名与查询中的完全匹配(PostgreSQL默认区分大小写)
- 错误处理逻辑:当前代码忽略了
status === 406的错误,建议移除该判断,直接抛出所有错误以便排查问题 - 网络环境:检查设备是否能正常访问Supabase实例地址,排除防火墙或代理拦截的可能
内容的提问来源于stack exchange,提问作者Yvonne Aburrow




