Я использую транзакцию outta knexjs для вставки значений в 2 таблицы (1. результат, 2. детали результата). при вставке значений в таблицу 2 (resultdetail) у меня есть массив объектов, размер которых зависит от каждой записи (в зависимости от количества субъектов).
{
"name": "Sally",
"fathername": "John",
"rollno": "85a76",
"classname": "class1",
"detail": [
{
"subject": "History",
"marksobt": "50",
"totalmarks": "100"
},
{
"subject": "French",
"marksobt": "75",
"totalmarks": "75"
}
]
}Я пытаюсь сделать это по следующему коду. (Опять же, размер массива "деталей" зависит от количества субъектов)
const { name, fathername, rollno, classname } = req.body;
db.transaction(trx => {
db.insert({
name: name,
fathername: fathername,
rollno: rollno,
classname: classname
}).into('results')
.transacting(trx)
.returning('rollno')
.then(roll_no => {
req.body.detail.map(result => {
return trx('resultdetail')
.returning('*')
.insert({
rollno: roll_no[0],
subject: result.subject,
marksobt: result.marksobt,
totalmarks: result.totalmarks
}).then(console.info)
})
})
.then(trx.commit)
.catch(trx.rollback)
})
.catch(err => res.status(400).json(err))Unhandled rejection Error: Transaction query already complete, run with DEBUG=knex:tx for more info


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


insertedRows = await knex('results').returning('*').insert([
{
"subject": "History",
"marksobt": "50",
"totalmarks": "100"
},
{
"subject": "French",
"marksobt": "75",
"totalmarks": "75"
}
]);
Но в основном ваша проблема в том, что вы запускаете несколько запросов + фиксируете одновременно, не дожидаясь готовности более ранних запросов ...
Когда вы добавляете что-то во вторую таблицу, это должно быть примерно так:
.then(roll_no => {
let resultsToAdd = req.body.detail.map(result => {
return {
rollno: roll_no[0],
subject: result.subject,
marksobt: result.marksobt,
totalmarks: result.totalmarks
};
});
return return trx('resultdetail')
.returning('*')
.insert(resultsToAdd);
})