Я пытаюсь сделать много вставок и обновлений, используя одну и ту же транзакцию из NodeJS, используя Knex.js.но я продолжаю получать эту ошибку "Запрос транзакции уже завершен, запустите с DEBUG = knex: tx для получения дополнительной информации".Я позволяю выяснить причину, хотя я обязательно возвращаю обещание от операции.
const { payments, reason } = refund;
const queries = [];
payments.forEach(payment => {
queries.push(
knex("variant_snapshots")
.select("variant_snapshots.payment_id as paymentId")
.sumDistinct({ PaymentTotal: "variant_snapshots.paid" })
.sumDistinct({ refunded: "refunds.amount" })
.leftJoin("refunds", "refunds.payment_id", "variant_snapshots.payment_id")
.whereExists(function() {
this.select("*")
.from("payments")
.where("id", payment.payment_id);
})
.andWhere("variant_snapshots.payment_id", payment.payment_id)
)
});
if (!payments || payments.length === 0) return false;
knex.transaction(async trx => {
return Promise.mapSeries(queries, function(payment) {
return payment()
.then(function(response){
let { PaymentId, PaymentTotal, refunded } = response;
Joi.validate(PaymentId, Joi.number().required());
let payment = payments.filter(item => item.payment_id === PaymentId);
Joi.validate(
payment.amount,
Joi.number().min(PaymentTotal - refunded || 0)
);
return trx("refunds")
.insert({
amount: payment.amount,
payment_id,
reason
})
.then(() => {
return trx("variant_snapshots")
.whereIn("id", payment.items)
.update({ refund_id: id });
});
});
})
.then(res => {
console.log("Done!");
trx.commit();
})
.catch(err => {
trx.rollback();
});
});
Я ожидал найти данные из базы данных, вставить новые данные и обновить другие строки, а затем вернуть true вконечный пользователь, если все идет хорошо или ложь, если произошла ошибка.