Как добавить элементы в две таблицы в одной экспресс-функции (mysql) - PullRequest
0 голосов
/ 28 мая 2019

Я создаю корзину для виртуального магазина, и при нажатии кнопки «Отправить» мне нужно вставить заказ в таблицу «Заказ», а товары - в таблицу «Элементы заказа».

Я использовал экспресс для вставки вещей только в одну таблицу для каждой функции, но теперь мне нужно поместить обе в одну и ту же ... Я пытаюсь сделать это с обещаниями.

Это мой HTML:

<table class="table">
            <thead>
                <tr scope="row">
                    <th scope="col">Product name</th>
                    <th scope="col">Price</th>
                    <th scope="col">Quantity</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="product in cart" v-bind:key="product.id" scope="row">
                    <td scope="col">{{product.name}}</td>
                    <td scope="col">{{product.price | currency}}</td>
                    <td scope="col"><input type="text" class="input-group-text" v-model="product.quantity"></td>
                </tr>
                <tr>
                    <td colspan="3">Frete: {{fare | currency}}</td>
                </tr>
                <tr>
                    <td colspan="3" class="highlighted">Total: {{total | currency}}</td>
                </tr>
            </tbody>
        </table>
        <button class="btn btn-info" @click="registerTransaction()">Submit cart</button>

это функция, которую я вызываю:

registerTransaction(){
            const date = new Date()
            const dateTime = {
                day: date.getUTCDate(),
                month: date.getUTCMonth(),
                year: date.getUTCFullYear(),
                hour: date.getUTCHours() - 3,
                minute: date.getUTCMinutes(),
                sec: date.getUTCSeconds()
            }
            const transaction = {
                date: new Date(`${dateTime.year}-${dateTime.month}-${dateTime.day}T${dateTime.hour}:${dateTime.minute}:${dateTime.sec}Z`)
            }
            transaction.userid = 1
            transaction.fare = parseFloat(this.fare)
            transaction.total = parseFloat(this.total)
            transaction.cart = this.cart


            axios.post(`${baseApiUrl}/checkout`, transaction)
                .then(() => this.$toasted.global.defaultSuccess())
                .catch(showError)
        }

и это мой бэкэнд для axios:

const save = (req, res) =>{
        const transaction = {...req.body}

        try{
            existsOrError(transaction.date, "Error: transaction date is invalid")
            existsOrError(transaction.userid, "Error in the user authentication")
            //existsOrError(transaction.fare, "Error in calculating the fare")
            existsOrError(transaction.total, "Error in the total value")
        }
        catch(msg){
            return res.status(400).send(msg)
        }

        app.db('orders')
            .insert(transaction)
            .then(console.log('feito!'))
            .then(saveProducts(transaction))
            .catch(err => res.status(500).send(err))



    }

    const saveProducts = (transaction) => {
        const orderId = app.db(`orders`).select(`idOrder`) .where({idClient: transaction.userid}).last()
        console.log('Done')
        for(let i = 0; i < transaction.cart.length; i++){
            quantity = app.db('products').select('quantity').where({id: transaction.cart[i].id}).first()
            quantity -= transaction.cart[i].quantity
            app.db('products').update(quantity).where({id: transaction.cart[i].id})
            const orderedProduct = {idOrder: parseInt(orderId), idProduct: parseInt(transaction.cart[i].id), quantity: parseInt(transaction.cart[i].quantity)}
            app.db('orderedproducts').insert(orderedProduct).then(console.log('produto inserido')).catch(err => res.status(500).send(err))
        }
        return
    }

Я ожидал, что он сначала сохранит мой заказ, вызовет функцию saveProducts, чтобы сохранить продукты в нем, и вернется, но он возвращает ошибку, как если бы это было запрещено ...

1 Ответ

0 голосов
/ 29 мая 2019

Я просмотрел документацию и нашел следующее, что в основном означает, что методы запросов имеют интерфейс обещаний, то есть мы можем присоединить then и метод catch.Это также означает, что мы можем использовать async/await на нем.

knex.select('*')
  .from('users')
  .where({name: 'Tim'})
  .then(function(rows) {
    return knex.insert({user_id: rows[0].id, name: 'Test'}, 'id').into('accounts');
  })
  .then(function(id) {
    console.log('Inserted Account ' + id);
  })
  .catch(function(error) { console.error(error); });

Для вашего кода я добавил async/await, если хотите, вы можете использовать then метод.

const save = (req, res) => {
  const transaction = { ...req.body };

  try {
    existsOrError(transaction.date, "Error: transaction date is invalid");
    existsOrError(transaction.userid, "Error in the user authentication");
    //existsOrError(transaction.fare, "Error in calculating the fare")
    existsOrError(transaction.total, "Error in the total value");
  } catch (msg) {
    return res.status(400).send(msg);
  }

  try {
    let orderId = await app
      .db("orders")
      .insert(transaction);
    console.log('order inserted :' + orderId);

    await saveProducts(transaction);
    console.log("saved all the products");
  } catch(err) {
    console.log(err);
  }
};

const saveProducts = async transaction => {
  const orderId = await app
    .db(`orders`)
    .select(`idOrder`)
    .where({ idClient: transaction.userid })
    .last();
  console.log("orderId : " + orderId);
  let quantity;
  for (let i = 0; i < transaction.cart.length; i++) {
    quantity = await app
      .db("products")
      .select("quantity")
      .where({ id: transaction.cart[i].id })
      .first();
    quantity -= transaction.cart[i].quantity;
    await app
      .db("products")
      .update(quantity)
      .where({ id: transaction.cart[i].id });
    const orderedProduct = {
      idOrder: parseInt(orderId),
      idProduct: parseInt(transaction.cart[i].id),
      quantity: parseInt(transaction.cart[i].quantity)
    };
    let insertedId = await app
      .db("orderedproducts")
      .insert(orderedProduct)
      .catch(err => res.status(500).send(err));
    console.log("inserted ordered product");
  }
  return;
};

ПРИМЕЧАНИЕ: я не выполнил кодпоэтому я не могу гарантировать, что это будет работать так, как вы хотите, но я уверен, что это даст вам представление о том, как двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...