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

NextAuth报错:useSession需包裹SessionProvider,配置_app.tsx仍无效

NextAuth useSession 必须包裹在 <SessionProvider /> 中的错误解决思路

问题场景

构建Next.js React应用时NextAuth异常,已在pages/_app.tsx中用SessionProvider包裹组件,但启动后仍收到错误:useSession must be wrapped in a <SessionProvider />。尝试删除.next文件夹并重启项目,问题依旧。

相关代码文件

pages/_app.tsx

import React from 'react';
import { SessionProvider } from "next-auth/react"
import type { AppProps } from "next/app"

export default function App({ Component, pageProps: {session, ...pageProps} }: AppProps) {
  return (
    <SessionProvider session={pageProps.session}>
      <Component {...pageProps} />
    </SessionProvider>
  )
}

pages/api/auth/[...nextauth].js

import NextAuth from "next-auth/next";
import GoogleProvider from "next-auth/providers/google";
export default NextAuth({
    providers:[
        GoogleProvider({
            clientId:process.env.GOOGLE_CLIENT_ID || '',
            clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',
        }),
    ]

});

src/app/page.tsx

import Image from 'next/image'
import Login from '../components/Login'


export default function Home() {
  return <Login />
    
}

src/components/Login.tsx

'use client';

import { useSession, signIn } from "next-auth/react"


export default function Login() {
  const { data: session } = useSession()

  if (session) {
    return <h1>Welcome</h1>
  } else {
    return (
        <div>
        <button onClick={() => signIn()}>Sign in</button>
        </div>
    )
  }
}

.env文件(脱敏后)

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
NEXTAUTH_URL=

解决思路

核心问题定位

当前使用的是Next.js App Router(src/app/目录结构),但pages/_app.tsx是Pages Router的全局入口文件,App Router环境下该文件不会被加载,导致SessionProvider未实际生效。

具体修复步骤

  1. 在App Router中配置全局SessionProvider
    在src/app/目录下创建providers.tsx:

    'use client';
    import { SessionProvider } from "next-auth/react";
    
    export function NextAuthProvider({ children }: { children: React.ReactNode }) {
      return <SessionProvider>{children}</SessionProvider>;
    }
    

    然后修改src/app/layout.tsx(无则创建),用该Provider包裹根布局:

    import { NextAuthProvider } from './providers';
    
    export default function RootLayout({
      children,
    }: {
      children: React.ReactNode;
    }) {
      return (
        <html lang="en">
          <body>
            <NextAuthProvider>{children}</NextAuthProvider>
          </body>
        </html>
      );
    }
    
  2. 修正Pages Router入口的session传递错误
    若需兼容Pages Router,原pages/_app.tsx中存在session传递错误,需改为:

    import React from 'react';
    import { SessionProvider } from "next-auth/react"
    import type { AppProps } from "next/app"
    
    export default function App({ Component, pageProps: { session, ...pageProps } }: AppProps) {
      return (
        <SessionProvider session={session}>
          <Component {...pageProps} />
        </SessionProvider>
      )
    }
    
  3. 完善环境变量配置
    确保.env中NEXTAUTH_URL配置正确,开发环境设为http://localhost:3000,生产环境填写实际域名:

    GOOGLE_CLIENT_ID=你的谷歌客户端ID
    GOOGLE_CLIENT_SECRET=你的谷歌客户端密钥
    NEXTAUTH_URL=http://localhost:3000
    
  4. 清理缓存并重启服务
    执行以下命令后重启开发服务器:

    rm -rf .next
    npm run dev
    

额外验证点

  • 确认Login.tsx中的'use client'指令存在(App Router下客户端组件必须声明)
  • 检查next-auth版本与Next.js版本适配,建议更新至最新稳定版:
    npm update next-auth
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:47:13