You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

  1. 安装bson库(用于生成标准MongoDB ObjectID):
npm install bson
# 或 pnpm add bson
  1. 修改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改为普通字符串类型:

  1. 更新你的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
  // 其他关联字段...
}
  1. 运行迁移更新数据库:
npx prisma migrate dev

修改后Lucia默认生成的随机字符串ID就能正常存入数据库,无需额外配置。

内容的提问来源于stack exchange,提问作者Ganesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:22:23