typescript - Hur konfigurerar man Better Auths DrizzleAdapter för att generera UUID:er kompatibla med Supabase?
Jag bygger en Next.js-applikation med Better Auth för autentisering och Supabase som databas. Better Auth genererar UUID:er i ett icke-standardformat (KZMw0N5rJhdi_i1JbWle6), men Supabase kräver UUID:er i standardformat (50928f86-1dbc-4b4a-8377-c83c81051f7c). Detta gör att skapandet av användare misslyckas med felet: "ogiltig inmatningssyntax för typ uuid".
Jag försökte åsidosätta UUID-genereringen i DrizzleAdapter-konfigurationen:
drizzleAdapter(db, {
provider: "pg",
generateId: () => TEST_UUID
})
Men fick ett TypeScript-fel: "Object literal may only specify known properties, and 'generateId' does not exist in type 'DrizzleAdapterConfig'" Jag försökte också ställa in ett standard-UUID i databasschemat:
id: uuid("id").primaryKey().default(sql`'${TEST_UUID}'::uuid`)
Men Better Auth genererar sitt ID innan det når databasskiktet. Better Auth bör generera eller acceptera UUID:er i formatet: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Svar #1
Om du använder v1 kan du istället använda alternativet advanced.generateId i din autentiseringskonfiguration. Du kan också returnera false om du föredrar att databasen genererar ID:t.
Svar #2
I grund och botten försöker Better Auth som standard skapa dessa unika ID:n innan det ens nått din databas. Nu, om du har din ORM (Drizzle i detta fall) helt inställd på att generera UUID:n själv, är det där konflikten uppstår. Det gör det i princip två gånger, och det kan leda till några skumma ID:n eller att det inte fungerar alls (mest troligt).
Du kan fixa det genom att justera din auth.ts konfigurationsfil, den som du ställer in Better Auth i, troligtvis belägen i src/app/lib/auth.ts.
Lägg bara till detta, advanced: { generateId: false } och det borde fungera.
Så här ser det ut i ett exempel på en auth.ts-fil:
import { db } from '@/db/drizzle';
import { betterAuth } from 'better-auth';
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
import { nextCookies } from 'better-auth/next-js';
import * as schema from '@/db/schema';
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: 'pg',
schema: schema
}),
advanced: {
generateId: false
},
session: {
expiresIn: 60 * 60 * 24 * 7,
updateAge: 60 * 60 * 24,
},
socialProviders: {
google: {
clientId: process.env.GOOGLE_CLIENT_ID as string,
clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,
},
},
plugins: [nextCookies()],
});
