【问题标题】:Property `role` does not exist on type `User | AdapterUser` in NextAuth属性 `role` 在 `User | 类型上不存在NextAuth 中的 AdapterUser`
【发布时间】:2022-12-10 02:07:52
【问题描述】:

我正在尝试构建一个实现 NextAuth 的 NextJS 应用程序。配置回调时,我在 [...nextauth].ts 中遇到以下错误:

Type error: Property 'role' does not exist on type 'User | AdapterUser'.
  Property 'role' does not exist on type 'User'.

  56 |     jwt: async ({ token, user }) => {
  57 |       // First time JWT callback is run, user object is available
> 58 |       if (user && user.id && user.role) {
     |                                   ^
  59 |         token.id = user.id;
  60 |         token.role = user.role;
  61 |       }

代码的完整回调部分如下所示:

  callbacks: {
    jwt: async ({ token, user }) => {
      // First time JWT callback is run, user object is available
      if (user && user.id && user.role) {
        token.id = user.id;
        token.role = user.role;
      }
      return token;
    },
    session: async ({ session, token }) => {
      if (token && token.id && token.role) {
        session.id = token.id;
        session.role = token.role;
      }
      return session;
    },
  },

我正在使用带有电子邮件和密码的 CredentialProvider。这是authorize

    async authorize(credentials) {
      if (!credentials || !credentials.email) return null;

      const dbCredentials = await executeAccountQuery(
        `SELECT password FROM auth WHERE email=?`,
        [credentials.email]
      );

      if (Array.isArray(dbCredentials) && "password" in dbCredentials[0]) {
        const isValid = await compare(
          credentials.password,
          dbCredentials[0].password
        );

        if (isValid) {
          return {
            id: "5",
            role: 99,
            name: "John Smith",
            email: credentials.email,
          };
        }
        return null;
      }
      return null; // login failed
    },

由于 authorize 函数的工作方式,我知道 User 对象将附加一个 role (因为我已经测试过),但我想不出一种方法来处理这个错误并摆脱它。

类似地,session 回调也出现错误,其中 session.idsession.role 也不存在于 Session 上。

【问题讨论】:

    标签: node.js typescript next.js next-auth


    【解决方案1】:

    在互联网上进行大量挖掘和反复试验之后,我能够弄清楚如何解决这个问题。

    您需要通过执行以下操作手动扩展 SessionUserJWT 类型:

    1. 在您的根项目目录中创建types/next-auth.d.ts
    2. 将以下内容插入文件:
      import { Session } from "next-auth";
      import { JWT } from "next-auth/jwt";
      
      declare module "next-auth" {
        interface Session {
          id: string;
          role: number;
        }
      
        interface User {
          id: string;
          role: number;
        }
      }
      
      declare module "next-auth/jwt" {
        interface JWT {
          id: string;
          role: number;
        }
      }
      
      
      1. 运行npm run build 并验证它是否正确构建。

    【讨论】:

      【解决方案2】:

      类型定义:

      types/next-auth.d.ts:

      import { DefaultUser } from 'next-auth';
      declare module 'next-auth' {
          interface Session {
              user?: DefaultUser & { id: string; role: string };
          }
          interface User {
              id: string;
              role: string;
          }
      }
      

      用法:

      async session({ session, user }) {
          if (session?.user) {
              session.user.id = user.id;
              session.user.role = user.role;
          }
      
          return session;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-09-23
        • 2018-07-30
        • 2022-12-09
        • 2021-03-14
        • 1970-01-01
        • 2018-01-29
        • 2020-08-23
        • 2021-11-04
        • 2021-04-11
        相关资源
        最近更新 更多