使用Japa测试框架+AdonisJS 5时部分测试报错:Transaction query already complete
解决AdonisJS 5 + Japa测试中部分用例触发「Transaction query already complete」错误
错误信息
× Uncaught exception Transaction query already complete, run with DEBUG=knex:tx for more info 1 completedError node_modules/knex/lib/execution/transaction.js:396 2 anonymous node_modules/knex/lib/execution/transaction.js:362 3 Client_MySQL2.trxClient.query node_modules/knex/lib/execution/transaction.js:358 4 Runner.query node_modules/knex/lib/execution/runner.js:123 5 ensureConnectionCallback node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13 6 Runner.ensureConnection node_modules/knex/lib/execution/runner.js:300 7 Runner.run node_modules/knex/lib/execution/runner.js:30 8 QueryRunner.executeQuery node_modules/@adonisjs/lucid/build/src/QueryRunner/index.js:78
核心原因
部分测试用例尝试在已完成(提交/回滚)的数据库事务中执行查询,通常由以下场景导致:
- 异步操作未正确用
await等待,导致事务在查询执行前被测试钩子关闭 - 测试钩子中的事务管理逻辑存在异步遗漏,提前终止了事务
- 手动事务操作后未正确清理,后续查询复用了已关闭的事务实例
解决方案
1. 强制等待所有异步操作
所有涉及数据库的请求、查询必须用await等待完成,避免事务在操作执行前被回滚:
test('创建用户接口验证', async ({ client }) => { // 错误写法:未等待异步请求完成 // client.post('/users').send({ name: 'foo' }) // 正确写法:用await等待响应 const response = await client.post('/users').send({ name: 'foo' }) response.assertStatus(201) })
2. 检查测试钩子的事务逻辑
AdonisJS 5默认通过全局事务隔离测试数据,确保钩子中的事务操作都用await等待:
// 错误写法:未等待事务启动/回滚 // beforeEach(() => Database.beginGlobalTransaction()) // afterEach(() => Database.rollbackGlobalTransaction()) // 正确写法:等待事务操作完成 beforeEach(async () => await Database.beginGlobalTransaction()) afterEach(async () => await Database.rollbackGlobalTransaction())
3. 规范手动事务的使用
如果测试中手动创建事务,必须确保事务完成后不再复用实例:
test('手动事务操作示例', async () => { const trx = await Database.transaction() try { await trx.from('users').insert({ name: 'bar' }) await trx.commit() } catch (err) { await trx.rollback() } // 错误写法:使用已关闭的trx实例查询 // await trx.from('users').where('name', 'bar') // 正确写法:使用默认数据库实例 await Database.from('users').where('name', 'bar') })
4. 启用事务调试定位问题
按照错误提示,启动测试时添加DEBUG=knex:tx环境变量,查看事务的启动、提交、回滚日志,精准定位违规操作:
DEBUG=knex:tx node ace test
内容的提问来源于stack exchange,提问作者M.Edriss Aria
相关产品推荐
相关产品推荐

