访问/users端点时Prisma报UUID转Int错误,求原因与解决办法
问题
访问/users端点时出现如下错误,请问原因是什么?有哪些修复方案?
[1] 19 const usersRouter = express_1.default.Router(); [1] 20 usersRouter.get("/", (req, res) => __awaiter(void 0, void 0, void 0, function* () { [1] 21 try { [1] → 22 const allUsers = yield prisma.user.findMany( [1] Error in domain logic: Conversion from `Uuid(ac44955b-ea51-474a-ae89-5a6e1744df9a)` to `Int` failed. [1] at Cn.handleRequestError (~\backend\node_modules\@prisma\client\runtime\library.js:123:6989) [1] at Cn.handleAndLogRequestError (~\backend\node_modules\@prisma\client\runtime\library.js:123:6206) [1] at Cn.request (~\backend\node_modules\@prisma\client\runtime\library.js:123:5926) [1] at async l (~\backend\node_modules\@prisma\client\runtime\library.js:128:9968)
预期行为
访问/users端点时,应返回所有用户的JSON数据:
[ { "userid": "d536eb96-02d5-4a7b-8b72-90c1585db30d", "user_name": "mockuser1", "user_abbreviation": "mu1" }, { "userid": "35c709e3-b498-4493-856b-f46b8df370a1", "user_name": "mockuser2", "user_abbreviation": "mu2" }, { "userid": "99718d23-bd15-446a-aef7-bb71c844bec5", "user_name": "mockuser3", "user_abbreviation": "mu3" } ]
复现步骤
技术栈:Node、Express、Typescript、Prisma、Postgres
- 使用PostgreSQL数据库,表主键为UUID字符串,已完成数据初始化
- 执行
npx prisma db pull成功生成Prisma Schema - 配置Express实现Prisma的CRUD操作,接口代码如下:
import express from "express"; import { PrismaClient } from "@prisma/client"; import { busyHandler, catchHandler, handleError } from "../../common/common.error"; const prisma = new PrismaClient(); const usersRouter = express.Router(); usersRouter.get("/", async (req, res) => { try { const allUsers = await prisma.user.findMany(); res.send(allUsers); } catch (err) { catchHandler(res, err); } finally { await prisma.$disconnect(); } });
已尝试的操作
- 将响应方法替换为
res.json(allUsers) - 给
findMany添加过滤条件:
usersRouter.get("/", async (req, res) => { try { const user = await prisma.user.findMany({where:{userid:'ac44955b-ea51-474a-ae89-5a6e1744df9a'}}); res.send(user); } catch (err) { catchHandler(res, err); } finally { await prisma.$disconnect(); } });
环境与Schema信息
Prisma Schema
model user { userid String @id @db.Uuid user_name String? user_abbreviation String? }
环境信息
- 操作系统:Windows
- 数据库:PostgreSQL
- Node.js版本:v16.14.2
- 框架:Express.js
- 语言:Typescript
- prisma版本:5.3.1
- @prisma/client版本:5.4.2
问题原因分析
错误核心原因是Prisma CLI与@prisma/client版本不匹配:你使用的prisma CLI是5.3.1,但@prisma/client是5.4.2。版本不一致会破坏Prisma内部的类型解析逻辑,导致新版本客户端尝试将UUID类型转换为旧版本CLI预期的Int类型,触发转换失败。
修复方案
1. 统一Prisma相关包版本
将prisma和@prisma/client的版本统一为同一版本,推荐使用与Node.js兼容的最新稳定版:
- 修改
package.json中的版本号,确保两者一致:{ "dependencies": { "@prisma/client": "5.4.2" }, "devDependencies": { "prisma": "5.4.2" } } - 重新安装依赖:
npm install - 重新生成Prisma Client:
npx prisma generate
2. 验证Schema与数据库映射
确保数据库中userid字段确实为UUID类型,可执行以下命令重新同步Schema:
npx prisma db push
注意:
db push会直接修改数据库,生产环境需谨慎操作
3. 移除不必要的连接断开操作
Prisma Client本身是连接池,无需每次请求后断开连接。移除finally块中的await prisma.$disconnect(),避免重复创建/销毁连接影响性能:
usersRouter.get("/", async (req, res) => { try { const allUsers = await prisma.user.findMany(); res.json(allUsers); } catch (err) { catchHandler(res, err); } });
内容的提问来源于stack exchange,提问作者Emmanuel
相关产品推荐
相关产品推荐

