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 } }) }
解决逻辑
- 在
update方法中,将await Database.transaction(...)的结果return出去,外层即可获取到事务回调内返回的{ success: true } - 修正变量名错误,确保关联关系操作的对象正确
内容的提问来源于stack exchange,提问作者smile code
相关产品推荐
相关产品推荐

