禁用服务器组件的next.js 13缓存(无获取)

svujldwt  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(121)

我试图重定向用户到其他网页的基础上,他们的登录状态。
我遇到了一个问题,当我第一次调用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

km0tfn4u

km0tfn4u1#

我想我在this advice here之后解决了一个类似的问题。
1.停止服务器
1.删除根目录中的/.next
1.重新启动服务器
你也可以opt out of this caching in each fetch request
但我想知道是否有一种方法可以在项目范围内停止这种缓存行为。

62lalag4

62lalag42#

在Next.js中,页面更改时布局不会重新呈现。为了解决这个问题,我将身份验证检查移动到特定页面。但是,我仍然需要服务器端身份验证检查。我在中间件中验证了令牌和JWT签名。
请注意,您不能在中间件中执行数据库操作,因为它运行在边缘上。有关边缘运行时的更多信息可以在Next.js documentation中找到。
P.S.许多DB驱动程序开始支持边缘运行时,你可能还需要研究。

相关问题