【发布时间】:2019-05-11 16:29:15
【问题描述】:
所以我有这个函数可以减少数据库中的库存,问题是,如果我必须减去 2 个不同项目的数量,Knex 将返回“检测到死锁”,因此代码上出现循环。
const updateOrder = (req, res, db, logger) => {
let {
status,
trx_id,
orNumber,
returnReason
} = req.body;
db.transaction((trx) => {
db('cart')
.returning('*')
.where('trx_id', '=', trx_id)
.update({
status: status,
or_num: orNumber,
return_reason: returnReason
})
.then(order => {
if (status === 'Success') {
db('cart')
.returning('*')
.where('trx_id', '=', trx_id)
.update({
date_purchased: new Date()
})
.then(purchased => {
db.transaction((trx) => {
db.select('*').from('cart_item').where({
cart_id: order[0].id,
trx_id: order[0].trx_id
})
.then(item => {
let newQuantity = [];
if (item[0]) {
for (let i = 0; i < item.length; i++) {
db.select('*').from('product').where('item_code', '=', item[i].item_code)
.then(product => {
for (let ii = 0; ii < product.length; ii++) {
if (product[ii]) {
newQuantity[ii] = parseInt(product[ii].stock) - parseInt(item[i].quantity)
db('product')
.returning('*')
.where('item_code', '=', item[i].item_code)
.update({
stock: newQuantity[ii]
})
.then(stock => {
if (stock[0]) {
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
})
.then(activity => {
if (activity[0]) {
res.json({
isSuccess: true
});
return;
} else {
res.json({
isSuccess: false
});
return;
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
}
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
}
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
})
.catch(err => logger.error(err));
})
.catch(err => logger.error(err));
} else if (status === 'Returned'){
if (order[0]) {
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,
return_reason: returnReason
})
.then(activity => {
if (activity[0]) {
res.json({
isSuccess: true
});
return;
} else {
res.json({
isSuccess: false
});
return;
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
}
}
else {
if (order[0]) {
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
})
.then(activity => {
if (activity[0]) {
res.json({
isSuccess: true
});
return;
} else {
res.json({
isSuccess: false
});
return;
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
}
}
})
.then(trx.commit)
.catch(err => {
logger.error(err);
trx.rollback;
res.render('pages/error-500');
});
})
.catch(err => logger.error(err));
}
module.exports = {
updateOrder
}
我对 NodeJS 还很陌生,我知道我的代码中有一个承诺地狱,因为我不能将承诺变平,因为我必须将前一个承诺的数据用于下一个承诺。
如果我只需要使用一个更新查询,代码可以正常工作,但是当我必须使用两个时遇到死锁。
【问题讨论】:
-
您必须将您的代码转换为 async/await。目前它是不可读的。将其转换为 async/await 将使其可读且易于操作。循环也是一个问题。使用 SQL,您不必使用循环,因为它是基于集合的。
标签: node.js postgresql express knex.js