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()],
});