前端转型全栈(三)——常见的错误及解决方案
问题 1PrismaClient 初始化错误错误信息PrismaClient needs to be constructed with a non-empty, valid PrismaClientOptions原因Prisma 版本不兼容schema.prisma 缺少 url 配置解决方案1. 确保 schema.prisma 中有 url 配置prismadatasource db {provider postgresqlurl env(DATABASE_URL)}2、确保 .env 文件存在且配置正确3、 重新生成客户端终端执行npx prisma generate问题 2数据库连接失败错误信息:Cant reach database server at localhost:5432排查步骤:1. 检查 PostgreSQL 服务是否启动powershellnet start postgresql-x64-162.检查端口是否被占用powershellnetstat -ano | findstr :54323. 检查防火墙设置4. 验证连接字符串格式postgresql://用户名:密码主机:端口/数据库名问题 3找不到模块 prisma/client解决方案:1)重新安装依赖bashnpm install prisma/client2)生成客户端npx prisma generate问题 4修改 seed.ts 后数据没更新原因:seed.ts 是脚本文件修改后需要手动运行解决方案:bashnpx ts-node prisma/seed.ts问题 5Prisma 版本冲突错误信息:Unknown property datasourceUrl provided to PrismaClient constructor原因:Prisma 7.x 版本 API 变更解决方案:降级到稳定版本bashnpm install prisma/client5 prisma5npx prisma generate问题 6Prisma generate 报 EPERM 错误错误信息:EPERM: operation not permitted, rename ...\query_engine-windows.dll.node.tmp... - ...\query_engine-windows.dll.node原因:后端服务正在运行锁定了 Prisma 引擎文件解决方案:1)停止正在运行的后端服务:在运行 npm run start:dev 的终端按 Ctrl C2)重新执行命令:bashnpx prisma generatenpx prisma db push3). 重新启动后端服务每次修改 prisma/schema.prisma 后都需要先停止服务再执行 npx prisma generate。问题 7接口返回 500 错误错误现象:前端调用接口时返回 500 Internal Server Error常见原因及解决方案:原因解决方案数据库字段不存在执行 npx prisma db push 同步表结构数据库连接失败检查 .env 中的 DATABASE_URL 配置请求参数格式错误检查 Controller 中的参数定义Prisma 客户端未生成执行 npx prisma generate排查步骤:1) 查看后端终端的错误日志2)检查数据库表结构是否与 schema.prisma 一致3)使用 Prisma Studio 验证数据bashnpx prisma studio问题 8数据库表为空没有测试数据解决方案:1配置 seed 脚本 package.json 中添加json{prisma: {seed: ts-node prisma/seed.ts}}2创建seed 文件:prisma/seed.tstypescriptimport { PrismaClient } from prisma/client;const prisma new PrismaClient();async function main() {await prisma.sceneResult.create({data: {name: 测试场景,description: 这是一个测试数据,status: 1,},});}main().catch(console.error).finally(() prisma.$disconnect());3)执行seed 命令bashnpx prisma db seed问题9主键冲突Unique constraint failed错误信息Unique constraint failed on the fields: (id)原因尝试插入的数据主键已存在解决方案1如果是 seed 脚本先清空表或使用 upsert 操作2或者删除重复的插入语句typescript// 使用 upsert 避免主键冲突await prisma.sceneResult.upsert({where: { id: 1 },update: { name: 更新后的名称 },create: { id: 1, name: 新名称, status: 1 },});问题 10删除接口报错 Record to delete does not exist错误信息PrismaClientKnownRequestError: An operation failed because it depends on one or more records that were required but not found.原因尝试删除的记录不存在解决方案在 Service 中添加错误处理typescriptasync deleteScene(id: number) {try {await this.prisma.sceneResult.delete({ where: { id } });return { msg: 删除成功, code: 200, data: null };} catch (error) {if (error.code P2025) {return { msg: 记录不存在, code: 404, data: null };}throw error;}}