
π― μ₯λ°κ΅¬λ APIλ₯Ό μ€κ³νκ³ μ½λμ μ μ©ν©λλ€.
cartItems μΆκ°id INT
book_id INT
quantity INT
user_id INT
IN μ°μ°μ μ¬μ©λ²IN μ°μ°μλ‘ λ¦¬μ€νΈκ°μ λ°μ λ°μ΄ν°λ₯Ό μ‘°νν μ μμ΅λλ€.
SELECT μ΄_μ΄λ¦ FROM ν
μ΄λΈ WHERE 컬λΌ_μ΄λ¦ IN (?);
β οΈ λ°μν μ€λ₯
μΈλν€ μ§μ μμ
error: 121 Duplicate key on write or updateμ€λ₯κ° λ°μνμμ΅λλ€.
λμΌν μ΄λ¦μ FK μ μ½ μ‘°κ±΄μ΄ μ΄λ―Έ μ‘΄μ¬νμ¬ μκΈ΄ μ€λ₯μμ΅λλ€.
π‘ ν΄κ²° κ³Όμ
FK μ μ½μ‘°κ±΄ λ€μ΄λ° κ·μΉμ μ νμ¬ λμΌν μ΄λ¦μ΄ μκΈ°μ§ μλλ‘ ν΄μ€λλ€.
fk_ν μ΄λΈλͺ _μ°Έμ‘°ν μ΄λΈλͺ _컬λΌλͺ
π μμ ν λΆλΆμ μ£Όν©μ κΈμ¨λ‘ λνλ
λλ€.
Method : POST
URL : /carts
HTTP Status Code : 200 Ok
Request Body
{
"bookId" : λμ id,
"quantity" : μλ,
"userId" : μ μ id
}
Response Body : x
TODO : νμ¬λ ν ν°μΌλ‘ νμ§ μκ³ ,userIdλ₯Ό bodyκ°μΌλ‘ λ°μμ μ²λ¦¬
Method : GET
URL : /carts
HTTP Status Code : 200 Ok
Request Body :
{
"userId" : μ μ id,
"selected" : [cartItemId, cartItemId ...]
}
[
{
"id" : μ₯λ°κ΅¬λ id,
"bookId" : λμ id,
"title" : "λμ μ λͺ©",
"summary" : "μμ½ μ€λͺ
",
"quantity" : μλ,
"price" : κ°κ²©
},
{
"id" : μ₯λ°κ΅¬λ id,
"bookId" : λμ id,
"title" : "λμ μ λͺ©",
"summary" : "μμ½ μ€λͺ
",
"quantity" : μλ,
"price" : κ°κ²©
},
]
TODO : νμ¬λ ν ν°μΌλ‘ νμ§ μκ³ ,userIdλ₯Ό bodyκ°μΌλ‘ λ°μμ μ²λ¦¬Method : DELETE
URL : /carts/:cartItemId
HTTP Status Code : 200 Ok
Request Body : x
Response Body : x
β οΈ λ°μν μ€λ₯
μ½λ μ€ν μμ
Error: listen EACCES: permission denied 0.0.0.0:9999μ€λ₯κ° λ°μνμμ΅λλ€.
ν¬νΈ μΆ©λ μ€λ₯λ‘ μΈν΄μ λ°μν μ€λ₯μ΄μ§λ§, ν¬νΈκ° μ¬μ© μ€μ΄μ§ μμμλ μ κ·Όμ΄ μ°¨λ¨λλ μ€λ₯μμ΅λλ€.
π‘ ν΄κ²° κ³Όμ
Windowsμμ
WinNAT(Windows Network Address Translation) μλΉμ€λ₯Ό μ€μ§νλ λͺ λ Ήμ΄λ₯Ό μ¬μ©ν΄μ ν¬νΈ μΆ©λμ ν΄κ²°ν΄μ€λλ€.
cmdλ₯Ό κ΄λ¦¬μ κΆνμΌλ‘ μ΄κ³ ν΄λΉ λͺ λ Ήμ΄λ₯Ό μ λ ₯ν΄μ£Όλ©΄ λ©λλ€.$ net stop winnat $ net start winnat
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const addToCart = (req, res) => {
const { bookId, quantity, userId } = req.body;
const sql =
'INSERT INTO cartItems (book_id, quantity, user_id) VALUES (?, ?, ?)';
const values = [bookId, quantity, userId];
conn.query(sql, values, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(result);
});
};
const getCartItems = (req, res) => {
const { userId, selected } = req.body;
const sql =
'SELECT cartItems.id, book_id, title, summary, quantity, price FROM cartItems LEFT JOIN books ON cartItems.book_id = books.id WHERE user_id = ? AND cartItems.id IN (?)';
const values = [userId, selected];
conn.query(sql, values, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(result);
});
};
const removeCartItems = (req, res) => {
const id = parseInt(req.params.id);
const sql = 'DELETE FROM cartItems WHERE id = ?';
conn.query(sql, id, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(result);
});
};
module.exports = { addToCart, getCartItems, removeCartItems };
addToCart : bookId, quantity, userIdλ₯Ό λ°μμ μ₯λ°κ΅¬λμ μΆκ°ν©λλ€.
getCartItems : cartItems ν
μ΄λΈκ³Ό books ν
μ΄λΈμ LEFT JOINνμ¬, userIdμ μ₯λ°κ΅¬λ νλͺ© μ€ selectedμ ν¬ν¨λ cartItems.id λͺ©λ‘μ μ‘°ννκ³ , ν΄λΉ book_idμ title, summary, quantity, price μ 보λ₯Ό κ°μ Έμ΅λλ€.
removeCartItems : id κ°μ λ°μμ μ₯λ°κ΅¬λμμ ν΄λΉ νλͺ©μ μμ ν©λλ€.
μ€λ μ€λ₯κ° λ§μ΄ λμ μ’ μ λ₯Ό λ¨Ήμμ§λ§, μ ν΄κ²°νλ€. 쿼리μ λ°°μ΄μ λ°μμ νμ©νλ λ°©λ²μ μμλ€!