Error when using Custom Tables
I am using Better Auth with NodeJS express written in Typescript. It works with default tables but when i customised the fields i get
Cannot read properties of undefined (reading 'findFirst')
error.
auth.ts
import { betterAuth } from 'better-auth';
import { prismaAdapter } from 'better-auth/adapters/prisma';
import { PrismaClientInstance } from './prisma';
export const auth = betterAuth({
user: {
modelName: 'users',
fields: {
email: 'email_address',
emailVerified: 'email_verified',
image: 'profile_picture',
createdAt: 'created_at',
updatedAt: 'updated_at'
},
additionalFields: {
role: {
type: 'string',
required: true,
defaultValue: 'user',
input: false
}
}
},
session: {
modelName: 'sessions',
fields: {
userId: 'user_id',
expiresAt: 'expires_at',
ipAddress: 'ip_address',
userAgent: 'user_agent'
}
},
account: {
modelName: 'accounts',
fields: {
userId: 'user_id',
accountId: 'account_id',
providerId: 'provider_id',
accessToken: 'access_token',
refreshToken: 'refresh_token',
expiresAt: 'expires_at'
}
},
verification: {
modelName: 'verifications',
fields: {
expiresAt: 'expires_at'
}
},
database: prismaAdapter(PrismaClientInstance.getInstance(), {
provider: 'postgresql',
}),
emailAndPassword: {
enabled: true,
requireEmailVerification: true
},
});
import { betterAuth } from 'better-auth';
import { prismaAdapter } from 'better-auth/adapters/prisma';
import { PrismaClientInstance } from './prisma';
export const auth = betterAuth({
user: {
modelName: 'users',
fields: {
email: 'email_address',
emailVerified: 'email_verified',
image: 'profile_picture',
createdAt: 'created_at',
updatedAt: 'updated_at'
},
additionalFields: {
role: {
type: 'string',
required: true,
defaultValue: 'user',
input: false
}
}
},
session: {
modelName: 'sessions',
fields: {
userId: 'user_id',
expiresAt: 'expires_at',
ipAddress: 'ip_address',
userAgent: 'user_agent'
}
},
account: {
modelName: 'accounts',
fields: {
userId: 'user_id',
accountId: 'account_id',
providerId: 'provider_id',
accessToken: 'access_token',
refreshToken: 'refresh_token',
expiresAt: 'expires_at'
}
},
verification: {
modelName: 'verifications',
fields: {
expiresAt: 'expires_at'
}
},
database: prismaAdapter(PrismaClientInstance.getInstance(), {
provider: 'postgresql',
}),
emailAndPassword: {
enabled: true,
requireEmailVerification: true
},
});
2 Replies
index.ts
server.get('/signup', async (req: Request, res: Response) => {
try {
const user = await auth.api.signUpEmail({
body: {
email_address: 'mail@gmail.com',
password: 'test12345',
name: 'Test Name'
}
})
return res.status(200).json(user);
} catch (error: any) {
return res.status(500).json({ message: error.message });
};
});
server.get('/signup', async (req: Request, res: Response) => {
try {
const user = await auth.api.signUpEmail({
body: {
email_address: 'mail@gmail.com',
password: 'test12345',
name: 'Test Name'
}
})
return res.status(200).json(user);
} catch (error: any) {
return res.status(500).json({ message: error.message });
};
});
schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(uuid())
name String
email_address String
email_verified Boolean
profile_picture String?
role String @default("user")
created_at DateTime @default(now())
updated_at DateTime @updatedAt
Session Session[]
Account Account[]
@@unique([email_address])
@@map("users")
}
model Session {
id String @id @default(uuid())
user User @relation(fields: [user_id], references: [id])
user_id String
expires_at DateTime @default(now())
ip_address String?
user_agent String?
@@map("sessions")
}
model Account {
id String @id @default(uuid())
user User @relation(fields: [user_id], references: [id])
user_id String
account_id String
provider_id String
access_token String?
refresh_token String?
expires_at DateTime?
password String?
@@map("accounts")
}
model Verification {
id String @id @default(uuid())
identifier String
value String
expires_at DateTime
@@map("verifications")
}
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(uuid())
name String
email_address String
email_verified Boolean
profile_picture String?
role String @default("user")
created_at DateTime @default(now())
updated_at DateTime @updatedAt
Session Session[]
Account Account[]
@@unique([email_address])
@@map("users")
}
model Session {
id String @id @default(uuid())
user User @relation(fields: [user_id], references: [id])
user_id String
expires_at DateTime @default(now())
ip_address String?
user_agent String?
@@map("sessions")
}
model Account {
id String @id @default(uuid())
user User @relation(fields: [user_id], references: [id])
user_id String
account_id String
provider_id String
access_token String?
refresh_token String?
expires_at DateTime?
password String?
@@map("accounts")
}
model Verification {
id String @id @default(uuid())
identifier String
value String
expires_at DateTime
@@map("verifications")
}
If you map it in Prisma, you won't need to modify the model names in the auth config.
otherwise it's gonna expect
User
to be defined as Users
which it's not in your case.