[next-auth]: `useSession` 必须包含在现有 js 文件的 <SessionProvider /> 错误中

orb*_*xus 5 javascript reactjs next.js next-auth

我将以下代码添加到现有的 js 文件中以验证身份验证,并且尝试遵循 next-auth 文档,但收到此错误“[next-auth]:useSession必须包装在 SessionProvider 中”

我使用 github 凭据进行验证

我的代码:浏览到 localhost:3000/auth/api/signin 时工作

[...nextauth.js]

import NextAuth from 'next-auth'
import GitHubProvider from 'next-auth/providers/github'
export default NextAuth({
    providers:[
        GitHubProvider({
            clientId: process.env.GITHUB_ID,
            clientSecret: process.env.GITHUB_SECRET,
        }),
    ],
})
Run Code Online (Sandbox Code Playgroud)

我想将身份验证放入 abc/index.js 中编写的代码中

这是我的带有 next-auth 的代码,并且抛出此错误“[next-auth]:useSession必须包装在 SessionProvider 中”

本地主机:3000/abc/index.js

import React, { Component, useMemo, useState, useEffect } from 'react';
import { useSession, SessionProvider } from 'next-auth/react';
function MyApp({ Component, pageProps }) { // i have added it here since I am not using _app.js file
  return (
    <SessionProvider session={pageProps.session}>
      <Component {...pageProps} />
    </SessionProvider>
  );
}
const abc = ({ json }) => {
  const { data: session } = useSession();
  if (session) {
    return (
      <>
        Signed in as {session.user.email} <br />
        <button onClick={() => signOut()}>Sign out</button>
      </>
    );
  }
  return (
    <>
      Not signed in <br />
      <button onClick={() => signIn()}>Sign in</button>
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)

Luc*_*ini 14

SessionProvider确保使用文件中的组件包装您的应用程序_app.js

import { SessionProvider } from 'next-auth/react';

function MyApp({ Component, pageProps }) {
    return (
      <SessionProvider session={pageProps.session}>
        <Component {...pageProps} />
      </SessionProvider>
    );
  }

export default MyApp;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请_app.js参阅 Next.js 文档


小智 7

我在更新到 Next.js 13 时遇到了类似的问题,我找到了解决方案:

  • “使用客户端”提供程序提取到单独的文件,
  • 用提供者包装子组件的layout.tsx,
  • 该布局中使用的所有pages.tsx都必须是服务器组件(没有“使用客户端”)

在主layout.tsx中,我使用Redux和NextAuth提供程序:

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>
        <NextAuthProvider>
          <ReduxProviders>
            {children}
          </ReduxProviders>
        </NextAuthProvider>
      </body>
    </html>
  );
}
Run Code Online (Sandbox Code Playgroud)

下一个身份验证提供商:

"use client";

import { SessionProvider } from "next-auth/react";

type Props = {
  children?: React.ReactNode;
};

export const NextAuthProvider = ({ children }: Props) => {
  return <SessionProvider>{children}</SessionProvider>;
};
Run Code Online (Sandbox Code Playgroud)

Redux 提供者:

"use client";

import store from "./store";
import { Provider } from "react-redux";

export function ReduxProviders({ children }: { children: React.ReactNode }) {
  return <Provider store={store}>{children}</Provider>;
}
Run Code Online (Sandbox Code Playgroud)