我试图重定向用户到其他网页的基础上,他们的登录状态。
我遇到了一个问题,当我第一次调用getSession时,它以某种方式被缓存。
getSession
const getSession = async (): Promise<TSession> => {
const token = cookies().get("token");
if (!token) return null;
const secret = new TextEncoder().encode(process.env.JWT_SECRET!);
const result = await jwtVerify(token.value, secret);
const sub = result.payload.sub;
// NOTE: Verify token in database
if (!sub) return null;
const user = await prisma.user.findFirst({ where: { id: sub } });
if (!user) return null;
return { user };
};
字符串
因此,如果用户注销,则初始会话为空。登录后,用户将重定向到/dashboard
登录密码
const onValid = async (data: SignInSchemaType) => {
try {
const user = await mutateAsync(data);
toast.success("Login successful");
dispatch({ type: "login_success", payload: user });
const callback = searchParams.get("callback") || "/dashboard";
router.push(callback);
} catch (e) {
if (e instanceof TRPCClientError)
setError("root", { message: e.message });
}
};
型
我确保cookie已更新,是的,它们是。当我导航到/
(索引)回来时,它不再将我重定向到/dashboard
。但是一旦我刷新页面,会话就会更新,并且它可以工作。
同样的情况发生在其他地方,当用户注销时,他重定向回/sign-in
,但当他导航到/dashboard
时,它工作了,现在会话再次缓存(这次不是null)
以下是我如何处理重定向
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const session = await getSession();
console.log(session);
if (session?.user) redirect("/dashboard/links");
// rest of code
}
型
P.S.上面的布局组件不是全局布局,它只分配给/
和/sign-in
2条答案
按热度按时间km0tfn4u1#
我想我在this advice here之后解决了一个类似的问题。
1.停止服务器
1.删除根目录中的
/.next
1.重新启动服务器
你也可以opt out of this caching in each fetch request。
但我想知道是否有一种方法可以在项目范围内停止这种缓存行为。
62lalag42#
在Next.js中,页面更改时布局不会重新呈现。为了解决这个问题,我将身份验证检查移动到特定页面。但是,我仍然需要服务器端身份验证检查。我在中间件中验证了令牌和JWT签名。
请注意,您不能在中间件中执行数据库操作,因为它运行在边缘上。有关边缘运行时的更多信息可以在Next.js documentation中找到。
P.S.许多DB驱动程序开始支持边缘运行时,你可能还需要研究。