Expo React Native调用supabase.auth.x时报错:undefined is not a function
Expo React Native中Supabase Auth方法报"undefined is not a function"的解决办法
1. 检查Supabase客户端初始化配置
核心问题大概率出在supabase-service.js的客户端配置上,需确保初始化逻辑正确:
正确的v2+版本初始化示例
import { createClient } from '@supabase/supabase-js'; import * as SecureStore from 'expo-secure-store'; // 替换为你的Supabase项目信息 const supabaseUrl = '你的Supabase项目URL'; const supabaseAnonKey = '你的Supabase匿名密钥'; // 适配Expo的安全存储适配器 const ExpoSecureStoreAdapter = { getItem: (key) => SecureStore.getItemAsync(key), setItem: (key, value) => SecureStore.setItemAsync(key, value), removeItem: (key) => SecureStore.deleteItemAsync(key), }; // 创建并导出配置好的客户端 const supabase = createClient(supabaseUrl, supabaseAnonKey, { auth: { storage: ExpoSecureStoreAdapter, autoRefreshToken: true, persistSession: true, detectSessionInUrl: false, // React Native环境无需此配置 }, }); export default supabase;
配套依赖安装命令:
npx expo install @supabase/supabase-js expo-secure-store
注意:不要误装supabase包(这是Supabase CLI工具,而非客户端SDK)。
2. 验证导入与导出逻辑
- 确认
App.js中import supabase from "./supabase-service.js"的路径、文件名拼写无误; - 检查
supabase-service.js是否用export default导出客户端实例,若用命名导出需对应修改导入语句为import { supabase } from "./supabase-service.js"。
3. 修正useEffect的执行逻辑
你的useEffect缺少依赖数组,会导致组件重复渲染执行,同时需清理订阅避免内存泄漏:
useEffect(() => { // 初始化获取当前会话 setAuth(supabase.auth.session()); // 订阅认证状态变更 const authSubscription = supabase.auth.onAuthStateChange((_event, session) => { setAuth(session); }); // 组件卸载时取消订阅 return () => authSubscription.unsubscribe(); }, []); // 空数组确保仅初始化执行一次
4. 排查SDK版本兼容性
若使用旧版@supabase/supabase-js(v1),初始化和方法调用逻辑与v2差异较大,建议升级到最新稳定版,规避版本兼容问题。
内容的提问来源于stack exchange,提问作者Suto
相关产品推荐
相关产品推荐

