`我目前正在开发一个 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:响应主体对象不应被干扰或锁定 在提取体
有人可以帮我吗?
谢谢你。
your text
`
我遇到了同样的问题,我降级到 13.5.2 现在对我来说工作正常。
如here中所述,问题是会话数据存储在cookie中,并且cookie仅在从浏览器发出请求时才可用,因此如果您升级,则必须从组件发出请求