2024.01.09(화)
submitOrder
오늘은 주문 API에서 DB에 주문을 INSERT하는 부분만 구현했다.
const submitOrder = (req, res) => {
const { userId, items, delivery, totalQuantity, totalPrice, firstBookTitle } = req.body;
let sql = "INSERT INTO delivery (address, recipient, contact) VALUES (?, ?, ?)";
let values = [delivery.address, delivery.recipient, delivery.contact];
conn.query(
sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
const delivery_id = results.insertId;
sql = "INSERT INTO orders (user_id, delivery_id, book_title, total_quantity, total_price) VALUES (?, ?, ?, ?, ?)";
values = [userId, delivery_id, firstBookTitle, totalQuantity, totalPrice];
conn.query(
sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
const order_id = results.insertId;
sql = "INSERT INTO ordered_book (order_id, book_id, quantity) VALUES ?";
values = [];
items.forEach((item) => values.push([order_id, item.bookId, item.quantity]));
conn.query(
sql, [values],
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
}
);
}
);
}
);
};
[values] = [[[oid1, bid1, q1], [oid2, bid2, q2], …]]
로 값을 넘겨주면[[oid1, bid1, q1], [oid2, bid2, q2], …]
→ (oid1, bid1, q1), (oid2, bid2, q2), …
로 convert된다.conn.format
으로 확인하기/**
* Nested Arrays → grouped lists (for bulk inserts)
*/
let formattedQuery = conn.format("INSERT INTO ordered_book (order_id, book_id, quantity) VALUES ?", [["oid1", "bid1", "q1"], ["oid2", "bid2", "q2"]]);
console.log(formattedQuery);
// INSERT INTO ordered_book (order_id, book_id, quantity) VALUES 'oid1', 'bid1', 'q1' ❌
formattedQuery = conn.format("INSERT INTO ordered_book (order_id, book_id, quantity) VALUES ?", [[["oid1", "bid1", "q1"], ["oid2", "bid2", "q2"]]]);
console.log(formattedQuery);
// INSERT INTO ordered_book (order_id, book_id, quantity) VALUES ('oid1', 'bid1', 'q1'), ('oid2', 'bid2', 'q2') ✅
/**
* Array → list
*/
formattedQuery = conn.format("SELECT * FROM cart WHERE user_id = ? AND item_id IN ?", [1, [1, 2]]);
console.log(formattedQuery);
// SELECT * FROM cart WHERE user_id = 1 AND item_id IN 1, 2 ❌
formattedQuery = conn.format("SELECT * FROM cart WHERE user_id = ? AND item_id IN (?)", [1, [1, 2]]);
console.log(formattedQuery);
// SELECT * FROM cart WHERE user_id = 1 AND item_id IN (1, 2) ✅
오늘 작성한 코드는 query가 중첩되어 너무 더럽다. 내일 수업에서 비동기에 대해 배우고 async와 await으로 순서대로 실행하도록 refactoring하는 것 같다. 또한 오늘 작성한 코드의 경우 여러 개의 query가 한 묶음으로 실행되어야 하기 때문에 추후 transaction으로 만들어야 할 것 같다.