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

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;,问题依旧
  • 反复排查代码逻辑,未找到问题根源

解决方向建议

  1. 重新生成Prisma客户端:修改Schema后必须执行prisma generate和prisma db push(或prisma migrate deploy),确保客户端代码同步Schema变更,否则旧客户端可能仍要求手动传入id。
  2. 完善id字段的自动生成规则:在Decision模型的id字段显式添加@default(auto()),确保Prisma自动生成MongoDB的ObjectId:
    id        String   @id @map("_id") @db.ObjectId @default(auto())
    
  3. 验证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 } });
    }
    
  4. 检查数据库连接配置:确认Prisma配置文件中的datasource使用mongodb provider,且连接字符串正确指向MongoDB实例,@db.ObjectId仅对MongoDB生效,配置错误会导致自动生成id失效。
  5. 升级Prisma版本:尝试将Prisma升级到最新稳定版,排查是否存在版本兼容性问题(Prisma5.x部分版本对MongoDB自动生成id的逻辑有调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:26:37