Search code examples
next.jsprismanext-auth

How can I use the Prisma adapter for Next-Auth without email and emailVerified values


I am using next-auth with a custom provider and the Prisma adapter and I only want to store the values: id, name, country, avatar, and gender. However, I am getting this error:

[next-auth][error][adapter_error_createUser] 
https://next-auth.js.org/errors#adapter_error_createuser
Invalid `p.user.create()` invocation in
.\node_modules\@next-auth\prisma-adapter\dist\index.js:6:38

  3 exports.PrismaAdapter = void 0;
  4 function PrismaAdapter(p) {
  5     return {
→ 6         createUser: (data) => p.user.create({
              data: {
                name: [redacted],
                wcaId: [redacted],
                country: [redacted],
                avatar: [redacted],
                gender: [redacted],
                email: undefined,
                emailVerified: null
                ~~~~~~~~~~~~~
              }
            })

Unknown arg `emailVerified` in data.emailVerified for type UserCreateInput. Available args:
...

The profile object in my custom provider looks like this:

profile(profile) {
    return {
      id: profile.me.id,
      name: profile.me.name,
      country: profile.me.country_iso2,
      avatar: profile.me.avatar.url,
      gender: profile.me.gender,
    };
  },

Everything in my Prisma schema follows the example in https://next-auth.js.org/adapters/prisma#setup except the User model which is like so:

model User {
  id            String    @id @default(cuid())
  name          String
  country       String    @db.Char(2)
  avatar        String
  gender        String    @db.Char(1)
  accounts      Account[]
  sessions      Session[]
  // Temporary workaround:
  email         String?   @unique
  emailVerified DateTime? @map("email_verified")
}

In the error, the adapter appears to have added email and emailVerified to the data object so the temporary workaround I am using is adding email and emailVerified columns to my Prisma model as shown above. However, this is not ideal, and I would like to know how I can remove these unnecessary columns from my database as their values are always undefined and null.


Solution

  • The authjs doc for the Prisma adapter offers the User's table's sample code, which has an 'emailVerified' field. When I tried to exclude this field from the User table, I encountered a similar error, which says that I should have the 'emailVerified' field. To fix this error, I added the createUser() method to the prismaAdapter, the code is like this:

     const prismaAdapter = PrismaAdapter(prisma);
    
    //@ts-ignore
    prismaAdapter.createUser = (data: User) => {
      return prisma.user.create({
        data: {
          name: data.name as string,
          email: data.email as string,
    
        },
      })
    }
    

    I got this solution from this post, and it worked fine.