使用SvelteKit+Prisma+Lucia+MongoDB创建用户时ObjectID长度错误
解决Lucia创建用户时MongoDB ObjectID格式错误问题
问题原因
Lucia默认生成的用户ID是随机短字符串(如示例中的Dw1LEILpEUHbZPi,长度15),但你的Prisma Schema中User模型的id字段设置为MongoDB的ObjectId类型,该类型要求ID必须是12字节的十六进制字符串(24字符长度),两者格式不匹配导致报错。
两种解决方案
方案1:让Lucia生成MongoDB兼容的ObjectID
通过自定义Lucia的用户ID生成逻辑,直接生成符合要求的ObjectID:
- 安装
bson库(用于生成标准MongoDB ObjectID):
npm install bson # 或 pnpm add bson
- 修改Lucia初始化文件(通常是
src/lib/server/auth.ts),添加generateUserId配置:
import { Lucia } from "lucia"; import { PrismaAdapter } from "@lucia-auth/adapter-prisma"; import prisma from "./prisma"; import { ObjectId } from "bson"; const adapter = new PrismaAdapter(prisma.session, prisma.user); export const auth = new Lucia(adapter, { sessionCookie: { attributes: { secure: process.env.NODE_ENV === "production" } }, // 自定义生成MongoDB ObjectID作为用户ID generateUserId: async () => { return new ObjectId().toString(); } }); declare module "lucia" { interface Register { Lucia: typeof auth; DatabaseUserAttributes: { email: string; unique_user_url: string; }; } }
这样Lucia创建用户时会自动生成24字符的标准ObjectID,完全匹配Prisma的@db.ObjectId类型要求。
方案2:修改Prisma Schema,使用普通字符串ID
如果不需要依赖MongoDB ObjectID的特性,可以直接将User模型的id改为普通字符串类型:
- 更新你的Prisma Schema:
model User { id String @id @default(cuid()) // 用cuid生成唯一ID,或保留Lucia默认生成逻辑 email String @unique unique_user_url String @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // 其他关联字段... }
- 运行迁移更新数据库:
npx prisma migrate dev
修改后Lucia默认生成的随机字符串ID就能正常存入数据库,无需额外配置。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

