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

Expo Router React Native中Supabase查询返回空数组的解决方法

Expo Router + Supabase 查询返回空数组的排查与修复

核心排查点

1. 行级安全策略(RLS)限制

Supabase默认给新表启用行级安全策略,且默认拒绝所有访问请求,这是导致查询空数组最常见的原因:

  • 登录Supabase后台,找到user_forums表的「安全」标签
  • 可临时关闭RLS(仅用于测试,生产环境不推荐)
  • 或添加允许查询的策略,比如允许所有认证用户查看:
    CREATE POLICY "允许认证用户查询user_forums" ON public.user_forums
    FOR SELECT USING (auth.role() = 'authenticated');
    
    若需更严格权限(比如仅用户查看自己的数据),可调整策略条件为user_id = auth.uid()。

2. 表名/字段名匹配问题

确认Supabase后台的表名是user_forums、字段名是user_id,注意PostgreSQL对双引号创建的对象区分大小写,避免拼写错误。

3. 用户认证状态验证

先确认当前用户已正确登录:在代码里打印User?.id,如果返回null,说明用户未完成认证,此时即使RLS允许匿名访问,也可能查不到数据(取决于你的策略)。

4. 直接在Supabase后台测试查询

进入Supabase的SQL编辑器,执行SELECT user_id FROM user_forums;:

  • 如果返回数据,说明问题出在前端代码或客户端配置
  • 如果也返回空,说明表本身数据有问题或权限未配置

5. Supabase客户端初始化检查

确认你在项目中正确初始化了Supabase客户端,使用了正确的项目URL和anon密钥,且依赖包@supabase/supabase-js版本适配Expo环境。

代码逻辑优化

原代码存在逻辑问题:循环中每遍历一条数据就直接跳转,会导致只判断第一条数据就结束流程。建议修改为:

const checkTransferForums = async () => {
  const { data: { user: User } } = await supabase.auth.getUser();
  
  // 先处理未登录情况
  if (!User) {
    router.replace('/(auth)/login');
    return;
  }

  const { data, error } = await supabase.from('user_forums').select('user_id');
  if (error) {
    console.error('查询失败:', error);
    return;
  }

  console.log('查询结果:', data);
  // 检查是否存在匹配当前用户的记录
  const hasMatchingRecord = data.some(row => row.user_id === User.id);
  
  hasMatchingRecord 
    ? (router.replace('/(auth)/'), console.log('跳转到首页'))
    : (router.replace('/forum/userForum'), console.log('跳转到论坛'));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:52:35