gpt4 book ai didi

node.js - 使 KnexJS 事务与异步/等待一起工作

转载 作者:行者123 更新时间:2023-11-29 13:10:06 25 4
gpt4 key购买 nike

我试图让事务与 async/await 和 knexjs 一起工作,但无济于事。

代码(片段是为了缩短帖子):

const updateOrder = (req, res, db, logger) => {
let {
status,
trx_id,
orNumber,
returnReason
} = req.body;

const updateStatus = () => {
return db('cart')
.returning('*')
.where('trx_id', '=', trx_id)
.update({
status: status,
or_num: orNumber,
return_reason: returnReason
});
}

const updateDate = () => {
return db('cart')
.returning('*')
.where('trx_id', '=', trx_id)
.update({
date_purchased: new Date()
});
}

const selectItems = (order) => {
return db
.select('*')
.from('cart_items')
.where({
cart_id: order.id,
trx_id: order.trx_id
});
}

const selectProduct = (item) => {
const queries = [];
item.forEach(item => {
const query = db.select('*')
.from('product')
.where('item_code', '=', item.item_code);
queries.push(query);
})
return Promise.all(queries);
}

const updateQuantity = (product, cart) => {
const prodQuantity = product.map(product => parseInt(product.stock));
const cartQuantity = cart.map(cart => parseInt(cart.quantity));
const newQuantity = [];
const queries = [];
for (let i = 0; i < product.length; i++) {
newQuantity.push(prodQuantity[i] - cartQuantity[i]);
}
cart.map((cart, index) => {
const query = db('products')
.returning('*')
.where('item_code', '=', cart.item_code)
.update({
stock: newQuantity[index]
})
queries.push(query);
})
return queries;
}

const updateLogs = () => {
return db('activity_order_logs')
.returning('*')
.insert({
date: new Date(),
employee_id: req.session.emp_id,
module: "MONITORING",
trx_id: trx_id,
activity: status,
or_num: orNumber
})
}

const sendResponse = (result) => {
if (result) {
res.json({
isSuccess: true
});
return;
} else {
res.json({
isSuccess: false
});
return;
}
}

(async() => {
const first = await updateStatus();

if (first[0].status == 'Success') {
const second = await updateDate().catch(err => {
throw err
});

const third = await selectItems(second[0]).catch(err => {
throw err
});

const fourth = await selectProduct(third).catch(err => {
throw err
});
const fourth2 = [].concat(...fourth);

const fifth = await updateQuantity(fourth2, third)
const decreaseStock = async() => {
const finalResult = [];
for (let i = 0; i < fifth.length; i++) {
const finalQuery = await Promise.resolve(fifth[i]);
finalResult.push(finalQuery);
}
return finalResult;
};

const result = await decreaseStock().catch(err => {
throw err
});
const result2 = [].concat(...result);
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);

} else if (first[0].status == 'Returned') {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
} else {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
}
})().catch(err => {
console.log(err);
res.json({
isSuccess: false
})
});
}

module.exports = {
updateOrder
}

我尝试过的:

第一次尝试 - 错误,返回交易因无错误而被拒绝

//knex is initialized as db
const createTransaction = () => {
return new Promise((resolve) => {
return db.transaction(resolve);
});
};

(async() => {
const trx = await createTransaction();
const first = await updateStatus();

if (first[0].status == 'Success') {
const second = await updateDate().catch(err => {
throw err
});

const third = await selectItems(second[0]).catch(err => {
throw err
});

const fourth = await selectProduct(third).catch(err => {
throw err
});
const fourth2 = [].concat(...fourth);

const fifth = await updateQuantity(fourth2, third)
const decreaseStock = async() => {
const finalResult = [];
for (let i = 0; i < fifth.length; i++) {
const finalQuery = await Promise.resolve(fifth[i]);
finalResult.push(finalQuery);
}
return finalResult;
};

const result = await decreaseStock().catch(err => {
throw err
});
const result2 = [].concat(...result);
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);

} else if (first[0].status == 'Returned') {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
} else {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
}

trx.commit();

})().catch(err => {
trx.rollback();
console.log(err);
res.json({
isSuccess: false
})
});

第二次尝试 - 结果:事务仍然提交并且没有回滚,即使存在故意错误也是如此。

//knex is initalized as db
(async() => {
try {
return await db.transaction(async trx => {
const first = await updateStatus();

if (first[0].status == 'Success') {
const second = await updateDate().catch(err => {
throw err
});

const third = await selectItems(second[0]).catch(err => {
throw err
});

const fourth = await selectProduct(third).catch(err => {
throw err
});
const fourth2 = [].concat(...fourth);

const fifth = await updateQuantity(fourth2, third)
const decreaseStock = async() => {
const finalResult = [];
for (let i = 0; i < fifth.length; i++) {
const finalQuery = await Promise.resolve(fifth[i]);
finalResult.push(finalQuery);
}
return finalResult;
};

const result = await decreaseStock().catch(err => {
throw err
});
const result2 = [].concat(...result);
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);

} else if (first[0].status == 'Returned') {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
} else {
const logs = await updateLogs().catch(err => {
throw err
});
const sendRes = await sendResponse(logs);
}
})
} catch (err) {
console.log(err);
res.json({
isSuccess: false
})
}
})

最佳答案

看起来你正在创建事务,但你没有向它发送任何查询,而是向 knex 连接池中的其他数据库连接发送查询。

这是使用 knex 进行交易的方式:

async () {
try {
const trxResult = await db.transaction(async (trx) => {
const queryResult = await trx('table').where(... etc. ...);
// do some more queries to trx
});
console.log("transaction was committed");
} catch (e) {
console.log("transaction was rolled back");
}
}

在将问题发布到 stackoverflow 之前,您还应该尝试将代码量减少到最少。将太多代码隐藏到片段中根本没有帮助。

关于node.js - 使 KnexJS 事务与异步/等待一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56088660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com