非故意拒绝错误:事务查询已完成-knex,express.js

非故意拒绝错误:事务查询已完成-knex,express.js,express,knex.js,Express,Knex.js,我试图首先检查一个表中的值,如果它存在,则删除另一个表中的一行并将新数据插入该表 我使用了一个带有select、del()和insert命令的事务 db.transaction(trx=>{ 返回trx('用户') .where({username:user.username}) .选择('用户名') .returning('用户名') 。然后(retData=>{ retUserName=retData[0]; 数据库(‘配置文件’) .where({username:user.usernam

我试图首先检查一个表中的值,如果它存在,则删除另一个表中的一行并将新数据插入该表

我使用了一个带有select、del()和insert命令的事务

db.transaction(trx=>{
返回trx('用户')
.where({username:user.username})
.选择('用户名')
.returning('用户名')
。然后(retData=>{
retUserName=retData[0];
数据库(‘配置文件’)
.where({username:user.username})
.del()
。然后(retData=>{
返回trx
.插入(配置文件数据)
.into('profile'))
。返回(“*”);
});
})
。然后(retData=>{
res.json({ProfileData:ProfileData});
})
.然后(trx.commit)
.catch(trx.rollback);
}).catch(err=>res.status(400).json(“无法创建配置文件”);
我得到了这个错误:事务查询已经完成


但数据尚未添加到表中。

您正在从事务处理程序回调返回承诺,这会导致事务自动提交/回滚,具体取决于返回的承诺是否解析/拒绝

直接从事务处理程序函数引发错误 自动回滚事务,与返回被拒绝的 答应我

请注意,如果在处理程序中没有返回承诺,则它将被终止 以确保调用trx.commit或trx.rollback,否则 事务连接将挂起


在代码中,您混合了这两种不同的事务使用方式,这导致事务被提交/回滚两次。

我遇到了不同的情况,但出现了相同的错误。也许这对某人有帮助

knex.transaction(async (t) => {
...
使用异步函数会产生相同的效果

这起作用了

knex.transaction((t) => {
...