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

AdonisJS事务内return返回值未被读取的问题排查与解决

AdonisJS事务返回值未被正确读取的问题解决

问题根源

你的代码中未返回Database.transaction的执行结果,update方法仅await了事务操作,但未将事务回调的返回值向外传递,导致外层方法默认返回undefined,控制台显示为空对象。此外代码中存在一处变量笔误:period.related('files')里的period应为前面定义的data变量(若实际运行未报错,大概率是笔误)。

事务使用核心逻辑

AdonisJS的数据库事务基于回调实现:

  • 回调内所有数据库操作共享同一事务上下文
  • 回调正常执行完毕时,事务自动提交
  • 回调抛出异常时,事务自动回滚
  • 回调的返回值会被Database.transaction方法返回,外层方法需主动return该值才能传递结果

修正后的代码

public async update(params: any) {
  // 关键:return 事务方法的执行结果
  return await Database.transaction(async (trx) => {
    const data = await Period.findOrFail(params.id, { client: trx })
    data.from = params.from
    data.to = params.to
    data.desc = params.desc

    data.useTransaction(trx)
    await data.save()

    let arrFiles = []
    for (let i in params.file_names) {
      arrFiles.push({
        fileName: Date.now() + '_' + params.file_names[i],
        fileUri: params.file_uris[i],
        createdBy: params.created_by,
      })
    }

    // 修正变量名:period → data
    await data
      .related('files')
      .updateOrCreateMany(arrFiles, 'fileUrl', { client: trx })
    await File.query()
      .whereIn('id', params.removed_file_id)
      .useTransaction(trx)
      .delete()
    return { success: true }
  })
}

解决逻辑

  1. 在update方法中,将await Database.transaction(...)的结果return出去,外层即可获取到事务回调内返回的{ success: true }
  2. 修正变量名错误,确保关联关系操作的对象正确

内容的提问来源于stack exchange,提问作者smile code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:40:16