Я использую: 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');
});