开发者问题收集

Next-auth:尽管已从 getServerSideProps 传递至页面的属性,但该属性仍未定义

2022-03-30
2857

我正在尝试将从 getSession 获取的会话(使用 next-auth )作为道具传递到页面。我知道我可以在组件中使用 useSession() ,但根据我的理解,这也应该可以工作,我不明白为什么它不起作用。

这似乎与 这个问题 中的问题类似,但没有答案。

这是我非常基本的 pages/settings.tsx :

import { Card, CardContent, Typography } from "@mui/material";
import { User } from "@prisma/client";
import { GetServerSideProps, NextPage } from "next";
import { getSession } from "next-auth/react";

interface SettingsProps {
  user: User,
}

const Settings : NextPage<SettingsProps> = ({user})=>{
  // in here, user is always undefined...
  return (
    <Card>
      <CardContent>      
        <Typography variant="h3">Settings</Typography>
        <Typography>UserId: {user.id}</Typography>
        <Typography>Created: {(new Date(user.createdAt)).toLocaleDateString()}</Typography>
      </CardContent>
      
    </Card>
  );
};

export const getServerSideProps: GetServerSideProps<SettingsProps> =  async (context) =>{
  const session = await getSession(context);

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

  console.log(session.user); // this works and logs the user

  return {
    props: { user: session.user },
  };
};

export default Settings;

我已经像这样增强了 next-auth 会话类型( types/next-auth.d.ts ):

import { User } from "@prisma/client";
import NextAuth from "next-auth";

declare module "next-auth" {
  /**
   * Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context
   */
  interface Session {
    user: User
  }
}

根据我对 React 和 NextJs 的理解,上面的代码应该可以完美运行,但是当访问页面时我得到

TypeError: Cannot read properties of undefined (reading 'id')
  13 |       <CardContent>      
  14 |         <Typography variant="h3">Settings</Typography>
> 15 |         <Typography>UserId: {user.id}</Typography>
     |                                  ^
  16 |         <Typography>Created: {(new Date(user.createdAt)).toLocaleDateString()}</Typography>
  17 |       </CardContent>
  18 |       

我做错了什么?

3个回答

我遇到了同样的问题,但纯属运气好解决了。

似乎 Next.js 通过其 pageProps 在页面中使用了 session 属性。因此,当我们尝试直接从 getServerSideProps 传递 session 时,由于某种原因,它在客户端组件上未定义。

简而言之,只需从 session 返回用户,或将 session 变量重命名为其他名称。

这是我在需要 SSR 身份验证保护的应用程序中使用的模式:

export const getServerSideProps: GetServerSideProps = async ({ req, res }) => {
  const session = await unstable_getServerSession(req, res, authOptions);
  const user = session?.user;

  if (!user) {
    return {
      redirect: {
        destination: "/",
        permanent: false,
      },
    };
  }

  return {
    props: {
      user,
    },
  };
};
Amruth Pillai
2022-08-17

尽管如果您在会话中有一个用户对象,并且在用户对象中有一个 id,那么一切对我来说都很好,正如您早些时候提到的那样。因此,您可以使用 可选更改。

<Typography variant="h3">Settings</Typography>
 <Typography>UserId: {user?.id}</Typography>
Sajeeb M Ahamed
2022-03-30

nextauth 文档 接口 {user: User & DefaultSession['user']>

Mbob05
2022-03-30