开发者问题收集

使用 next auth 进行 Oauth 时,getServerSession 始终在 nextjs 13.5.2 api 路由处理程序中返回 null

2023-09-25
733

`我目前正在开发一个 To-Do 应用来练习 Next.js 和 Next-Auth。我正在使用 Next-Auth 作为 OAuth 提供程序,并且我想向每个具有相应用户 ID 的待办事项添加“createdBy”属性。这将允许我获取特定用户的待办事项。但是,我在 API 路由中检索当前用户的详细信息时遇到了问题,因为“getServerSession”函数始终返回 null。

这是我的下一个身份验证设置

import { authOptions } from '@/lib/auth-options'
import NextAuth from 'next-auth'


const handler = NextAuth(authOptions)

export {handler as GET,handler as POST}

这是我的 authOptions

import { type NextAuthOptions } from "next-auth";
import GithubProvider from "next-auth/providers/github";
import { getAuthCredentials } from "./secrets";
export const authOptions: NextAuthOptions = {
  providers: [
    GithubProvider({
      clientId: getAuthCredentials().clientId,
      clientSecret: getAuthCredentials().clientSecret,
    }),
  ],
  secret: getAuthCredentials().secret,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    jwt: ({ token, user, session }) => {
      if (user) {
        token.id = user.id;
      }
      return token;
    },
    session: ({ session, token }) => {
      if (token?.id) {
        session.user.id = token.id;
      }
      return session;
    },
  },
  pages: {
    signIn: "/signin",
    signOut: "/signout",
  },
};

在服务器组件中使用 getServerSession(authOptions) 时工作​​正常 在客户端组件中使用 useSession() 时也工作正常

但在 api 路由中它返回 null

这是我用于创建待办事项的 api 路由处理程序 // api/todos

export async function POST(req: NextRequest) {
  let body = await req.json();
  const session = await getServerSession(authOptions);
  console.log({ session });
  // {session : null}
  let validateBody = addTodoSchema.safeParse(body);
  console.log({ validateBody });
  if (!validateBody.success) {
    return NextResponse.json({
      success: false,
      error: validateBody.error,
    });
  }
  try {
    await connectToDatabase();
    let todo = await prisma.todo.create({
      data: {
        ...body,
        createdBy: session?.user.id,
      },
    });
    return NextResponse.json({
      success: true,
      data: todo,
      message: "Todo created successfully",
    });
  } catch (error: any) {
    console.log({ error });
    return NextResponse.json({
      success: false,
      error: error.message,
    });
  } finally {
    await prisma.$disconnect();
  }
}

这是向上述端点发出请求的代码

"use server";
import { headers } from "next/headers";
export const addTodo = async ({ title }: { title: string }) => {
  try {
    let res = await fetch("http://localhost:3000/api/todos", {
      method: "POST",
      headers: headers(),
      body: JSON.stringify({
        title,
      }),
    });
    let data = await res.json();
    console.log({ data });
  } catch (error: any) {
    console.log({ error });
    // throw new Error(error.message);
  }
};

单击提交时,我从表单传递标题 在上面代码我添加了 headers() 我在某处看到过它但它仍然不起作用

我在终端中收到此错误

⨯ TypeError:响应主体对象不应被干扰或锁定 在 extractBody

有人可以帮我解决这个问题吗?

谢谢。 你的文字

`

2个回答

我遇到了同样的问题,我降级到 13.5.2,现在它运行良好。

Alidotm
2023-09-26

此处 所述,问题在于会话数据存储在 cookie 中,并且仅当从浏览器发出请求时 cookie 才可用,因此如果您升级,则必须从组件发出请求

Vahé Khachaturian
2024-04-14