Prisma Schema(MongoDB)自定义类型无法正常使用问题排查
Prisma 使用自定义嵌入式类型时的错误排查
问题场景
原本可正常运行的Prisma Schema,在使用自定义类型loginStats创建用户时失败,抛出以下错误:
Unknown arg `set` in data.loginInfo.set for type loginStatsCreateInput. Did you mean `select`? Argument lastLogin for data.loginInfo.lastLogin is missing.
原Schema代码
generator client { provider = "prisma-client-js" binaryTargets = ["native", "rhel-openssl-1.0.x"] } datasource db { provider = "mongodb" url = env("DATABASE_URL") } model User { id String @id @default(auto()) @map("_id") @db.ObjectId email String @unique given_name String last_name String loginInfo loginStats role Role @default(User) Articles Article[] } model Article { id String @id @default(auto()) @map("_id") @db.ObjectId createdAt DateTime @default(now()) updatedAt DateTime @updatedAt published Boolean @default(false) title String author User? @relation(fields: [authorId], references: [id]) authorId String? @db.ObjectId } type loginStats { createdAt DateTime @default(now()) lastLogin DateTime } enum Role { User Admin }
原测试函数代码
import { Request, Response } from "express"; import cognitoUserPoolHelper from "../authLogin"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export const test = async (req: Request, res: Response) => { if (!prisma) { console.log(req); } const user = await prisma.user.create({ data: { email: "randoms@example.com", given_name: "Test", last_name: "Test", loginInfo: { set: { createdAt: Date.now().toString(), lastLogin: Date.now().toString(), }, }, }, }); console.log(user); res.json({ msg: "Hello World", }); };
错误原因
- 错误1:误用
set关键字
Prisma中,set是用于更新操作时替换整个嵌入式对象的语法,而创建用户时,嵌入式类型(type定义的子文档)直接传入对象结构即可,不需要包裹set。 - 错误2:
DateTime类型值格式错误
Schema中loginStats的字段为DateTime类型,要求传入Date对象或ISO 8601格式的字符串,但代码中使用Date.now().toString()返回的是时间戳字符串,不符合类型要求,导致Prisma无法识别有效值,进而误判为字段缺失。
解决方案
步骤1:(可选)调整Schema字段可选性
如果希望创建用户时可以暂不传入lastLogin(后续再更新),可以给loginStats的lastLogin添加可选标记:
type loginStats { createdAt DateTime @default(now()) lastLogin DateTime? # 添加?标记为可选字段 }
步骤2:修正测试函数代码
去掉多余的set关键字,传入符合DateTime要求的格式值:
import { Request, Response } from "express"; import cognitoUserPoolHelper from "../authLogin"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export const test = async (req: Request, res: Response) => { const user = await prisma.user.create({ data: { email: "randoms@example.com", given_name: "Test", last_name: "Test", loginInfo: { // 直接传入嵌入式对象,无需set createdAt: new Date(), // 使用Date对象 lastLogin: new Date() // 或使用ISO字符串:new Date().toISOString() }, }, }); console.log(user); res.json({ msg: "Hello World", }); };
步骤3:重新生成Prisma Client
修改Schema后,记得重新生成Client:
npx prisma generate
内容的提问来源于stack exchange,提问作者Chappo
相关产品推荐
相关产品推荐

