首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在next-auth中使用数字用户id

如何在next-auth中使用数字用户id
EN

Stack Overflow用户
提问于 2022-10-20 23:48:48
回答 1查看 114关注 0票数 2

我最近发现并开始测试创建-T3-应用程序作为NextJS项目的一个新的基础,因为它为TypeScript、trpc、prisma和next-auth这样的东西提供了大量的样板设置,这样可以节省我大量的时间。虽然这是相关的,但我不认为这是我问题的根源。我的问题是,我使用具有自动递增用户id的MySQL数据库,但next-auth包的类型似乎迫使我使用字符串( next-auth/core/types.d.ts中的DefaultUsernext-auth/adapters.d.ts中的AdapterUser )都将id类型设置为string,注释说UUID)。考虑到我可以扩展支持数字用户ID的内容,我将其添加到next-auth.d.ts

代码语言:javascript
复制
import { DefaultSession, DefaultUser } from 'next-auth'

declare module 'next-auth' {
  interface User extends DefaultUser {
    id: number;
  }
  interface Session {
    user?: {
      id: number;
    } & DefaultSession['user'];
  }
}

它似乎在大多数地方起作用,但在[...nextauth].ts中,它给了我这个错误。

输入'string \ number‘不能分配给输入'number’。输入“string”不能指定输入‘number’. to (2322)

在这部分代码中的session.user.id = user.id行上

代码语言:javascript
复制
export const authOptions: NextAuthOptions = {
  // Include user.id on session
  callbacks: {
    session({ session, user }) {
      if (session.user) {
        session.user.id = user.id
      }
      return session
    }
  },
  adapter: PrismaAdapter(prisma),
  providers: []
}

export default NextAuth(authOptions)

如果我从TypeScript中删除AdapterUser中的id: string;行,那么next-auth/adapters.d.ts错误就会消失,然后返回到id: number;,因为我在User上设置了这一行。

代码语言:javascript
复制
export interface AdapterUser extends User {
    id: string; // <-- I removed this
    email: string;
    emailVerified: Date | null;
}

我不认为我应该修改库的类型来支持数字用户ID,但是我完全没有解决这个问题的想法,也没有在网上找到答案。或者,即使数据库使用数字I,也不应该使用数字I?如果有用的话,我在用

代码语言:javascript
复制
next 12.3.1
next-auth 4.12.3
react 18.2.0
react-dom 18.2.0
superjson 1.9.1
zod 3.18.0
eslint 8.22.0
postcss 8.4.14
prettier 2.7.1
prisma 4.4.0
tailwindcss 3.1.6
typescrypt 4.8.0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-29 21:06:29

不幸的是,“修补”或更改库所具有的类型似乎是不可能的--甚至试图更改NextAuthOptions也无法工作,因为后续的属性定义必须具有相同的类型。同时,您必须使用运行时检查/强制或强制转换:

代码语言:javascript
复制
export const authOptions: NextAuthOptions = {
  // Include user.id on session
  callbacks: {
    session({ session, user }) {
      if (session.user) {
        if (typeof user.id !== "number") throw new Error("id should a number");
        session.user.id = user.id // OK
        // session.user.id = +user.id // more dangerous but still works
        // session.user.id = user.id as number // also dangerous
      }
      return session
    }
  },
  adapter: PrismaAdapter(prisma),
  providers: []
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74147383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档