Node.js多表关联场景下Prisma update操作报记录不存在错误
问题根因
你遇到的报错是Prisma ORM的默认行为触发的:update方法要求where条件必须精准匹配到1条存在的记录,只要匹配结果为0条就会直接抛出Record to update not found异常,和多表关联规则没有直接关系,你的代码存在几个核心问题导致异常始终触发:
- 逻辑顺序完全写反:你先执行update操作、直接返回成功响应,之后才判断查询结果是否为空。只要id匹配不到记录,update语句会直接抛异常,根本走不到你写的
if (!deleteBook)兜底分支,错误捕获逻辑完全失效。 - 入参合法性校验缺失:没有提前判断传入的
productId是否为有效值,若出现productId为undefined、空值、类型和数据库字段不匹配(比如数据库存数字类型id但传入了字符串)的情况,where条件必然匹配不到记录。 - 若你给Prisma配置了软删除全局中间件,默认会过滤所有
is_active=false的记录,如果目标图书已经被软删过,update操作会因为默认查询不到该记录直接抛错。
修复方案
推荐用updateMany替代原生update实现软删除,该方法在匹配不到记录时不会抛出异常,只会返回受影响的记录行数,更适合需要自定义"记录不存在"返回逻辑的业务场景,修正后代码如下:
// 先校验入参合法性 if (!productId) { await BasicResponse(res, 0, 'Invalid Product ID', []) return } try { const deleteOp = await prisma.aca_book_list.updateMany({ where: { id: productId, is_active: true // 配置了软删除全局过滤时加该条件,避免重复操作已删除记录 }, data: { is_active: false } }) // 根据操作结果返回对应响应 if (deleteOp.count === 0) { await BasicResponse(res, 0, 'Book Not Found to Delete', []) return } await BasicResponse(res, 1, 'Book Deleted', { id: productId, is_active: false }) } catch (err) { console.error('Book soft delete failed:', err) await BasicResponse(res, 0, 'Delete Operation Failed', []) }
其他可选方案
如果你坚持使用update方法,必须在执行更新前先查询确认记录存在,再执行更新操作:
const targetBook = await prisma.aca_book_list.findUnique({ where: { id: productId }, select: { id: true } }) if (!targetBook) { await BasicResponse(res, 0, 'Book Not Found to Delete', []) return } const deleteBook = await prisma.aca_book_list.update({ where: { id: productId }, data: { is_active: false } }) await BasicResponse(res, 1, 'Book Deleted', deleteBook)
内容的提问来源于stack exchange,提问作者Owali Ullah Shawon
相关产品推荐
相关产品推荐

