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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:33:21