Next.js 13 -新应用目录中的SSR身份验证

xt0899hw  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(127)

几周前,我最近过渡到使用新的应用程序目录,当涉及到解决各种问题时,我仍然在寻找自己的立足点。
我有一个服务器函数,它与我的服务器通信,使用授权令牌头获取当前用户的详细信息。
我的目标是在我的应用程序布局中使用这个功能,因为我想避免每次用户在页面之间导航时都运行它-它似乎没有效率。
我遇到的一个障碍是,我不能使用React Context或其他状态管理库,因为它们需要“使用客户端”指令,我宁愿不在这个场景中使用。
我的问题是,如何将用户对象传递给布局中的所有子组件?
我很愿意接受我可能没有以最有效的方式处理这个问题的可能性,所以任何反馈或替代解决方案都将非常感谢。
谢谢!

  • P.S.:我已经尝试使用Cookie保存用户数据,但它没有工作。它说了一些关于我如何只能在服务器操作/路由处理程序中修改cookie的事情... *

我想使用SSR(服务器端渲染)对我的应用程序进行身份验证。我不希望在身份验证方面有任何加载状态。相反,我希望我的应用加载已经可用的用户详细信息。

9w11ddsr

9w11ddsr1#

请查看以下模式是否适合您。其想法是在服务器组件中获取用户详细信息,并将用户详细信息传递给客户端组件,该客户端组件创建用户上下文,该用户上下文可以在React树的任何客户端组件中使用。

import UserContextProvider from "@/app/UserContext";
import ClientComponent from "@/app/ClientComponent";

// setting revalidate to 0 for testing purpose
export const revalidate = 0;

async function fetchUser() {
  return { name: "John Doe", email: "john.doe@example.com" };
}

export default async function Home() {
  const user = await fetchUser();

  return (
    <UserContextProvider user={user}>
      <ClientComponent />
    </UserContextProvider>
  );
}
// UserContext.tsx

"use client";

import * as React from "react";

type UserContextType = {
  name: string;
  email: string;
};

const UserContext = React.createContext<UserContextType | null>(null);

export function useUserContext() {
  const context = React.useContext(UserContext);
  if (context) return context;
  throw new Error("useUserContext must be used within UserContext.Provider");
}

export default function UserContextProvider({
  user,
  children,
}: React.PropsWithChildren & { user: UserContextType }) {
  return <UserContext.Provider value={user}>{children}</UserContext.Provider>;
}
// ClientComponent.tsx

"use client";

import { useUserContext } from "@/app/UserContext";

export default function ClientComponent() {
  const user = useUserContext();

  return (
    <>
      <p>{user.name}</p>
      <p>{user.email}</p>
    </>
  );
}

相关问题