Поместите logi c для создания и обновления элемента корзины на стороне клиента или на стороне сервера? - PullRequest
1 голос
/ 18 апреля 2020

Я использую: NodeJs, MySQL, React, Express, Ax ios.

Какие варианты лучше всего использовать: opsi 1 или 2?

Большое спасибо / \:)

Опси 1. Сделайте логи c на стороне СЕРВЕРА

a. клиентская сторона

  • Я не проверяю, был ли CartId + productId уже создан в таблице cartItems
  • Я не вызываю сообщение http, чтобы создать "cartId + productId" в таблице cartItems если он еще не создан.
  • Я использую свойство: «изменить» вместо количества. Просто интересно, было бы лучше, если бы я изменил код, получив элемент, используя «http get» и используя «количество: item.quantity + 1» вместо «изменить свойство».
  • Код настолько прост, только две строки кода
async addToCart(product) {
   const cartId = await getOrCreateCartId();
   await http.put(`${apiEndpoint}/${cartId}/items/${product.id}`, { change: 1 });
}

b. Серверная сторона

  • Я не совсем уверен, рекомендуется ли "создавать новую запись", используя "http put" вместо "http post"
router.put('/carts/:cartId/items/:productId', async (req, res) => {
   // validate req.body, if not valid, return 400
   // validate req.params.cartId, if not found, return 404
   // validate req.params.productId, if not found, return 404

   let shoppingCartItem = await ShoppingCartItem.query().findById([
       req.params.cartId,
       req.params.productId,
   ]);

   if (!shoppingCartItem)
      shoppingCartItem = await ShoppingCartItem.query().insertAndFetch({
      cartId: req.params.cartId,
      productId: req.params.productId,
      quantity: req.body.change,
    });
    else
       shoppingCartItem = await shoppingCartItem
      .$query()
      .increment('quantity', req.body.change);

    res.send('cart item created / quantity updated');
});

Opsi 2. сделать лог c на стороне КЛИЕНТА

a. сторона клиента

  • Мне кажется, что код становится трудно читать
async function addToCart(product) {
  const cartId = await getOrCreateCartId();

  try {
    const { data: item } = await http.get(
      `${apiEndpoint}/${cartId}/items/${product.id}`
    );

    await http.put(`${apiEndpoint}/${cartId}/items/${product.id}`, {
      productId: product.id,
      quantity: item.quantity + 1,
    });
  } catch (ex) {
    await http.post(`${apiEndpoint}/${cartId}/items`, {
      productId: product.id,
      quantity: 1,
    });
  }

b. сторона сервера

  • Я добавляю 2 новых обработчика маршрута: http get & http post
  • Http Post, только создайте новую запись
  • Http Put, ТОЛЬКО обновите запись
  • Http Get, чтобы клиент мог проверить, существует элемент или нет
router.get('/:cartId/items/:productId', async (req, res) => {
  const shoppingCartItem = await ShoppingCartItem.query().findById([
    req.params.cartId,
    req.params.productId,
  ]);

  if (!shoppingCartItem) return res.status(404).send('The shopping cart item with the given ID was not found.');

  res.send(shoppingCartItem);
});

router.post('/:id/items', async (req, res) => {
   // validate req.body, if not valid, return 400
   // validate req.params.cartId, if not found, return 404
   // validate req.params.productId, if not found, return 400
   // validate req.params.cartId+productId, if found, return 400, Shopping Cart Item already added

   const  shoppingCartItem = await ShoppingCartItem.transaction(async (trx) => {
   await shoppingCart
      .$query(trx)
      .patch({ updatedAt: moment().format('YYYY-MM-DD HH:mm:ss') });

   return await ShoppingCartItem.query(trx).insertAndFetch({
      cartId: req.params.id,
      productId: req.body.productId,
      quantity: req.body.quantity,
    });
  });

  res.send(shoppingCartItem);
});

router.put('/:cartId/items/:productId', async (req, res) => {
   // validate req.body, if not valid, return 400
   // validate req.params.cartId, if not found, return 404
   // validate req.params.productId, if not found, return 400
   // validate req.params.cartId+productId, if not found, return 404, The shopping cart item with the given ID was not found.

   await ShoppingCartItem.transaction(async (trx) => {
   await shoppingCart
      .$query(trx)
      .patch({ updatedAt: moment().format('YYYY-MM-DD HH:mm:ss') });

   return await shoppingCartItem
      .$query(trx)
      .patchAndFetch({ quantity: req.body.quantity });
  });

  res.send('cart item created / quantity updated');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...