как добавить элементы в базу данных для биллинговых систем - PullRequest
0 голосов
/ 05 марта 2019

Я занимаюсь разработкой облачной биллинговой системы, и в моей базе данных есть две таблицы, а именно bill_history и sold_items.Я хочу сохранить номер счета, дату, имя клиента, номер телефона и общую сумму, а затем вернуть номер счета из bill_history и сохранить массив объектов, содержащий номер товара, имя товара, цену, количество, сумму с возвращеннымсчет № в sold_items.Я использую следующий код:

app.post('/billed', (req, res) => {
    const { items, total, date } = req.body;
    console.log(items, total, date);

    db.transaction(trx => {
        db.insert({
            total: total,
            date: date,
          }).into('billhead')
          .transacting(trx)
          .returning('billno')
          .then(num => {
              for (var i = 0; i < items.length; i++) {
                trx.insert({
                  billno: num,
                  prodname: items[i].name,
                  quantity: items[i].quantity,
                  netprice: items[i].amount
                }).into('billdetails')
              }).then(trx.commit())
            .catch(trx.rollback())
          })
    })

Теперь записи найдены в bill_history, но не введены в sold_items.Я не могу найти ошибку!Помоги мне с этой ошибкой.Консоль и терминал показывают No Error

1 Ответ

0 голосов
/ 06 марта 2019

Важная вещь, которую следует помнить при работе с запросами knex: они обещания , и они будут выполняться только в том случае, если:

  1. Вы вызываете , а затем в knexсам объект
  2. Вы возвращаете запрос 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
...