typescript - დამატებითი მონაცემების დაბრუნება მაღალ დონეზე ავტორიზაციის კომპონენტში Next.js-ში


მე მაქვს შემდეგი კოდის ნაკრები:

export const requireAuth = (gssp: GetServerSideProps) => {
  return async (ctx: GetServerSidePropsContext) => {
    const { req } = ctx;
    let session = null;

    if (req?.headers?.cookie) {
      session = await getSession(req?.headers?.cookie);
    };

    if (!session) {
      return {
        redirect: {
          permanent: false,
          destination: '/login',
        },
      };
    };
    return await gssp(ctx);
  };
};

მეც ვცდილობ, რომ დავაბრუნო სესია await gssp(ctx)-ში, მე ახალი ვარ NextJS-ში და ვერ ვპოულობ რაიმე დაკავშირებულ ინფორმაციას ამ საკითხზე.

მიუხედავად იმისა, რომ ეს მეთოდი მიძლევს საშუალებას გამოვიყენო ეს კომპონენტი შემდეგი გზით:

export const getServerSideProps: GetServerSideProps = requireAuth(async _ctx => {
  let account;
  let stats = {};

  if (_ctx?.req?.headers?.cookie) {
    account = await getSession(_ctx?.req?.headers?.cookie);
  }

  try {
    const X = fetchSomeData...;
  } catch (error) {
    console.log('Pages/Index Fetching Error: ', error);
  }

  return {
    props: {
      account: account,
      data: X,
      navbar: true,
      footer: true,
    },
  };
});

რომელიც საშუალებას აძლევს დამატებით ლოგიკას იმ გვერდზე, სადაც ის გამოიყენება, სხვა HOR მეთოდებთან შედარებით.

არის გზა, რომ სესიას მთავარი requireAuth კომპონენტში დავბრუნებინო გვერდზე თითო არასდროს ვფეტჩავდე?

პასუხი #1

თქვენ აკონტროლებთ, რას გადასცემს უმაღლესი რიგის ფუნქცია რეალურ gssp ფუნქციას, ამიტომ შეგიძლიათ მარტივად გადასცეთ სესია ctx ობიექტში.

export const requireAuth = (gssp: GetServerSidePropsWithSession) => {
    return async (ctx: GetServerSidePropsContext) => {
        const { req } = ctx;
        const session = req?.headers?.cookie ? await getSession(req?.headers?.cookie) : null;

        if (!session) {
            return {
                redirect: { permanent: false, destination: '/login' }
            };
        };

        const ctxWithSession = { ...ctx, session };

        return await gssp(ctxWithSession);
    };
};

შემდეგ შეგიძლიათ წვდომა გქონდეთ session-ზე თქვენი getServerSideProps კოდის შიგნით.

interface GetServerSidePropsContextWithSession extends GetServerSidePropsContext {
    session?: Session;
}

type GetServerSidePropsWithSession<P extends { [key: string]: any } = { [key: string]: any }> = (
    context: GetServerSidePropsContextWithContext
) => Promise<GetServerSidePropsResult<P>>;

export const getServerSideProps: GetServerSidePropsWithSession = requireAuth(async _ctx => {
    const account = _ctx.session;
        
    // Remaining code...
});

შენიშვნა: გემოდინება, რომ საჭირო იქნება GetServerSideProps ტიპის გაფართოება, რათა გამოელაპარაკოს session ველს.