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

Supabase持续抛出HTTP 406(Not Acceptable)错误原因排查

问题解决:Supabase查询返回406 (Not Acceptable)错误

问题情况

你当前Supabase的RLS已禁用,角色为anon,之前正常运行的Next.js代码现在无法工作。代码如下:

const fetchSupabaseUser = async (firebaseUser: FirebaseUser | null) => {
      if (!firebaseUser) return;

      const { data, error, status } = await supabase
        .from('users')
        .select('*')
        .eq('google_id', firebaseUser.uid)
        .single();

      console.log(error, status);

      if (error && status !== 406) {
          console.error("Supabase error:", error);
          throw error
      }
      // if (error) console.error("Supabase error:", error);
      
      if (error && Object.keys(error).length !== 0) {
          if (error instanceof Error) {
              console.error('Error fetching Supabase user:', error.message);
          // } else {
          //   console.error('An unknown error occurred while fetching Supabase user:', error);
          }
          return;
      }

      setUser(data);
      console.log('Supabase user set:', data);
};

Chrome控制台报错:

fetch.ts:15 GET https://mkibhcvvghfyxutpsaqe.supabase.co/rest/v1/users?select=*&google_id=eq.mbRwFh8AgLZuSaXCscIIkJNFTBz1 406 (Not Acceptable)

错误详情(已翻译):

{
code: 'PGRST116',
details: '结果包含0行数据',
hint: null,
message: '请求返回JSON对象,但实际返回多条(或零条)数据'
}

错误原因

你使用了.single()方法,这个方法强制要求查询必须恰好返回1条数据,但当前根据google_id没有查到任何用户(0行),所以Supabase返回406错误,提示不符合预期的返回格式。

解决方案

可以通过以下几种方式处理:

1. 允许返回0或1条数据

把.single()替换成.returns('single').maybe(),这样当没有数据时不会抛出错误,data会是null:

const { data, error, status } = await supabase
  .from('users')
  .select('*')
  .eq('google_id', firebaseUser.uid)
  .returns('single')
  .maybe();

2. 调整错误处理逻辑

保留.single(),但明确处理406错误(即无数据的情况),比如:

const { data, error, status } = await supabase
  .from('users')
  .select('*')
  .eq('google_id', firebaseUser.uid)
  .single();

if (error) {
  if (status === 406) {
    // 无匹配用户的逻辑,比如提示用户注册
    console.log('未找到对应用户');
    return;
  } else {
    console.error("Supabase错误:", error);
    throw error;
  }
}

setUser(data);
console.log('Supabase用户已设置:', data);

3. 先查询数组再判断

去掉.single(),直接获取数组结果,然后判断是否有数据:

const { data, error } = await supabase
  .from('users')
  .select('*')
  .eq('google_id', firebaseUser.uid);

if (error) {
  console.error("Supabase错误:", error);
  throw error;
}

if (data.length === 0) {
  console.log('未找到对应用户');
  return;
}

// 取第一条数据
setUser(data[0]);
console.log('Supabase用户已设置:', data[0]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:50:08