Важная вещь, которую следует помнить при работе с запросами knex: они обещания , и они будут выполняться только в том случае, если:
- Вы вызываете , а затем в knexсам объект
- Вы возвращаете запрос knex внутри цепочки обещаний и вызываете затем где-то по цепочке
Внутри для цикла , вы только указали, что должен делать объект knex, и из-за синтаксических ошибок не вызывал тогда сам объект knex .
.into ('billdetails'). Then (вставки => {///})
Это сработает, если вы вернете trx.insert () ...
Это, как говорится, не подходит для вашего варианта использования, так как при вставке нескольких значений внутри транзакции, вы должны убедиться, что все вставки были успешными.Использование для зацикливает, как вы делали это в асинхронном режиме, опасно и не гарантирует, что все отдельные вставки были выполнены без ошибок, и что безопасно совершать транзакцию.
Один из способов достижения этогобезопасным образом изменил бы этот раздел вашего кода:
// ...
.returning('billno')
.then(num => {
// We create an array of individual inserts
// Each element in the array will be a single knex
// object/promise that inserts one row into the database
const billDetailInserts = items.map(item => trx.insert({
billno: num,
prodname: item.name,
quantity: item.quantity,
netprice: item.amount
).into('billdetails')
})
// we utilize the Promise.all method that will resolve when
// all individual inserts have completed succesfully
return Promise.all(billDetailInserts);
})
.then(inserts => {
// ... commits, rollbacks, logging etc