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
相关产品推荐
相关产品推荐

