Next14+Prisma+MongoDB创建Decision对象时遇未预期ID参数错误
问题:Next14 + Prisma5 创建Decision对象时提示id必填错误
近期使用Next14.0.1搭配Prisma5.5.2和Shadcn UI开发,尝试向MongoDB的Decision集合创建简单对象时出错。服务器动作代码未传入id参数,因为按Schema配置,id应通过Prisma自动生成(通过@map()映射为MongoDB的_id字段),但提交表单时仍收到id必填的错误提示。
Prisma Schema 代码
model Pros { id String @id @map("_id") @db.ObjectId createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") title String weight Int decision Decision? @relation(fields: [decisionId], references: [id]) decisionId String @map("decision") } model Cons { id String @id @map("_id") @db.ObjectId createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") title String weight Int decision Decision? @relation(fields: [decisionId], references: [id]) decisionId String? @map("decision") } model Decision { id String @id @map("_id") @db.ObjectId createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") title String pros Pros[] Cons Cons[] }
服务器动作代码
import prisma from "@/lib/prisma" export const addDecision = async (formData) => { await prisma.decision.create({ data: { title: formData.get("title"), }, }) }
表单UI代码
'use client' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { addDecision } from "@/lib/actions" export default function AddDecision({ children }) { return ( <Dialog> <DialogTrigger>Open</DialogTrigger> <DialogContent> <DialogHeader> <DialogTitle>Are you sure absolutely sure?</DialogTitle> <DialogDescription> <form action={addDecision}> <input name="title" placeholder="title" /> <input type="submit" value="Submit" /> </form> </DialogDescription> </DialogHeader> </DialogContent> </Dialog> ) }
已尝试但未解决的方案
- 移除Schema中id字段的
@map注解,Prisma直接报错 - 在服务器动作中添加
const { title } = formData;,问题依旧 - 反复排查代码逻辑,未找到问题根源
解决方向建议
- 重新生成Prisma客户端:修改Schema后必须执行
prisma generate和prisma db push(或prisma migrate deploy),确保客户端代码同步Schema变更,否则旧客户端可能仍要求手动传入id。 - 完善id字段的自动生成规则:在Decision模型的id字段显式添加
@default(auto()),确保Prisma自动生成MongoDB的ObjectId:id String @id @map("_id") @db.ObjectId @default(auto()) - 验证FormData数据有效性:在服务器动作中先提取并校验title字段,避免空值触发Prisma的额外校验逻辑:
export const addDecision = async (formData) => { const title = formData.get("title")?.trim(); if (!title) throw new Error("Title cannot be empty"); await prisma.decision.create({ data: { title } }); } - 检查数据库连接配置:确认Prisma配置文件中的datasource使用
mongodbprovider,且连接字符串正确指向MongoDB实例,@db.ObjectId仅对MongoDB生效,配置错误会导致自动生成id失效。 - 升级Prisma版本:尝试将Prisma升级到最新稳定版,排查是否存在版本兼容性问题(Prisma5.x部分版本对MongoDB自动生成id的逻辑有调整)。
内容的提问来源于stack exchange,提问作者Coleb
相关产品推荐
相关产品推荐

