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
相关产品推荐
相关产品推荐

