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

React应用中supabase.auth.session is not a function错误求助

问题:Supabase最新版中调用supabase.auth.session()报错,React页面空白

问题代码

import React, { useState, useEffect } from 'react';
import { createClient } from '@supabase/supabase-js';

// 注意:此处URL和密钥为示例值,需替换为真实Supabase项目信息
const supabase = createClient('httpsfwefwfwfwf', 'wfw');

function App() {
    const [user, setUser] = useState(null);

    useEffect(() => {
        const session = supabase.auth.session();
        setUser(session ? session.user : null);

        const { data: authListener } = supabase.auth.onAuthStateChange(
            async (event, session) => {
                setUser(session ? session.user : null);
            }
        );

        return () => {
            authListener.unsubscribe();
        };
    }, []);

    async function handleLogin() {
        const { error } = await supabase.auth.signIn({ provider: 'google' });
        if (error) {
            console.error('Error logging in:', error);
        }
    }

    async function handleLogout() {
        const { error } = await supabase.auth.signOut();
        if (error) {
            console.error('Error logging out:', error);
        }
    }

    return (
        <div>
            <button onClick={handleLogin} style={{display: user ? 'none' : 'block'}}>Login with Google</button>
            <button onClick={handleLogout} style={{display: user ? 'block' : 'none'}}>Logout</button>
            {user && <div><p>Email: {user.email}</p></div>}
        </div>
    );
}

export default App;

错误日志

Uncaught TypeError: supabase.auth.session is not a function
    at App.js:10:1
    at commitHookEffectListMount (react-dom.development.js:23150:1)
    at commitPassiveMountOnFiber (react-dom.development.js:24926:1)
    at commitPassiveMountEffects_complete (react-dom.development.js:24891:1)
    at commitPassiveMountEffects_begin (react-dom.development.js:24878:1)
    at commitPassiveMountEffects (react-dom.development.js:24866:1)
    at flushPassiveEffectsImpl (react-dom.development.js:27039:1)
    at flushPassiveEffects (react-dom.development.js:26984:1)
    at react-dom.development.js:26769:1
    at workLoop (scheduler.development.js:266:1)

解决方案

1. 替换废弃的session()方法

Supabase JS SDK v2+移除了同步的supabase.auth.session(),改用异步的getSession()方法。需要修改useEffect中的初始化逻辑:

将原来的同步获取会话代码替换为异步获取,并调整useEffect的结构以支持异步操作:

useEffect(() => {
    // 异步获取初始会话
    const fetchInitialSession = async () => {
        const { data: { session } } = await supabase.auth.getSession();
        setUser(session?.user ?? null);
    };
    fetchInitialSession();

    // 监听认证状态变化逻辑保持不变
    const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
        setUser(session?.user ?? null);
    });

    return () => {
        authListener.unsubscribe();
    };
}, []);

2. 替换真实的Supabase项目信息

当前代码中使用的Supabase URL和密钥是无效的示例值,必须替换为你在Supabase控制台中获取的项目URL和anon公钥,否则后续登录功能会失败。

3. 可选:简化状态赋值逻辑

使用可选链运算符?.和空值合并运算符??可以让代码更简洁,替代原有的三元判断逻辑。

修复后完整代码

import React, { useState, useEffect } from 'react';
import { createClient } from '@supabase/supabase-js';

// 替换为你的Supabase项目URL和anon密钥
const supabase = createClient('https://your-project-url.supabase.co', 'your-anon-key');

function App() {
    const [user, setUser] = useState(null);

    useEffect(() => {
        const fetchInitialSession = async () => {
            const { data: { session } } = await supabase.auth.getSession();
            setUser(session?.user ?? null);
        };
        fetchInitialSession();

        const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
            setUser(session?.user ?? null);
        });

        return () => authListener.unsubscribe();
    }, []);

    async function handleLogin() {
        const { error } = await supabase.auth.signIn({ provider: 'google' });
        if (error) console.error('Error logging in:', error);
    }

    async function handleLogout() {
        const { error } = await supabase.auth.signOut();
        if (error) console.error('Error logging out:', error);
    }

    return (
        <div>
            <button onClick={handleLogin} style={{ display: user ? 'none' : 'block' }}>Login with Google</button>
            <button onClick={handleLogout} style={{ display: user ? 'block' : 'none' }}>Logout</button>
            {user && <div><p>Email: {user.email}</p></div>}
        </div>
    );
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:59:58