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

Next.js使用Prisma向SQLite提交表单数据调用create方法报错

Prisma新增数据报类型不匹配错误解决

错误场景

使用Prisma操作SQLite数据库写入doctor表数据时,触发如下报错:

Error: 
Invalid `prisma.doctor.create()` invocation:

{
  data: '{"id":"1","firstName":"ehshan","middleName":"ehhsns","lastName":"khan","gender":"Female","specialization":"Cardiologist","date":"2022-06-10","phoneNumber":"1234456112","address":"vfdgh dhyh ssvg"}'
        
}

Argument data: Got invalid value '{"id":"1","firstName":"ehshan","middleName":"ehhsns","lastName":"khan","gender":"Female","specialization":"Cardiologist","date":"2022-06-10","phoneNumber":"1234456112","address":"vfdgh dhyh ssvg"}' on prisma.createOneDoctor. 

Provided String, expected DoctorCreateInput or DoctorUncheckedCreateInput:
type DoctorCreateInput {
  id: String

  firstName: String

  middleName: String

  lastName: String

  gender: String

  specialization: String

  date: String

  phoneNumber: String

  address: String
}

错误根因

报错明确提示传入的data参数是字符串类型,但Prisma期望接收DoctorCreateInput或DoctorUncheckedCreateInput类型的结构化对象,问题出在接口代码的写法上。
原始错误代码:

import { PrismaClient,Prisma } from "@prisma/client"

const prisma = new PrismaClient();

export default async function handler(req, res) {
   
    let user = Prisma.DoctorCreateInput 
    user= JSON.stringify(req.body);
    const saveData = await prisma.doctor.create({
        data: user
    })

    res.json(saveData );
    //console.log(data)
}

代码存在两个明确问题:

  • 错误使用Prisma导出的TS类型:Prisma.DoctorCreateInput是TypeScript类型,仅在编译阶段做类型校验,无法在JavaScript运行时作为变量赋值
  • 错误序列化请求体:JSON.stringify(req.body)会把原本的请求体对象转换为JSON字符串,和Prisma要求的对象参数类型完全不匹配

修复方法

直接传入解析后的请求体对象即可,不需要做字符串转换,修复后的JS代码如下:

import { PrismaClient } from "@prisma/client"

const prisma = new PrismaClient();

export default async function handler(req, res) {
    // 直接使用框架自动解析好的req.body对象
    const saveData = await prisma.doctor.create({
        data: req.body
    })

    res.json(saveData);
}

补充说明

  • 大部分Node.js API框架(Next.js、Express、NestJS等)默认都会自动解析JSON格式的请求体,req.body本身就是符合要求的JS对象,不需要额外做序列化操作
  • 如果你手动关闭了框架的默认请求体解析,需要先执行JSON.parse(req.body)把请求体字符串转为JS对象,再传给Prisma
  • 如果是TypeScript项目,可以引入类型做编译期校验,写法如下:
import { PrismaClient, DoctorCreateInput } from "@prisma/client"

const prisma = new PrismaClient();

export default async function handler(req, res) {
    const user = req.body as DoctorCreateInput;
    const saveData = await prisma.doctor.create({
        data: user
    })

    res.json(saveData);
}

内容的提问来源于stack exchange,提问作者mohd ehshan khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:18:17