๋ชฉ๋ก๐ฉ๐ป ๋ฐฑ์๋(Back-End) (156)
๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท ์นดํ ๊ณ ๋ฆฌ ์์ฑํ๊ธฐ (POST) ๐ท ์นดํ ๊ณ ๋ฆฌ ์์ ํ๊ธฐ (PUT) ๐ท ์นดํ ๊ณ ๋ฆฌ ์ญ์ ํ๊ธฐ (DELETE) ๐ท ์ฝ๋ โ controllers/categoryCtrl.js const Category = require("../models/Category"); const asyncHandler = require("express-async-handler"); const { validateMongodbID } = require("../utils/validateMongodbID"); // ์นดํ ๊ณ ๋ฆฌ ์์ฑํ๊ธฐ const createCategory = asyncHandler(async (req..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท ์ข์ํ๋ ๋ธ๋ก๊ทธ ํฌ์คํธ ํ๊ธฐ (PUT) ์ข์ํ๋ ๋ธ๋ก๊ทธ๊ฐ ์๋ค๋ฉด ํฌ์คํธํ ๋ธ๋ก๊ทธ๋ฅผ PUSH!!! ์ทจ์ํ๋ค๋ฉด PULL!!! $push ์ ํ์ : Field๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์์๋ฅผ ๋ฐฐ์ด ๋์ ์ถ๊ฐ : pushํ๋ ์๊ฐ ๋ฐฐ์ด๋ก ๋ฐ๋ $pull ์ ํ์ : ์กฐ๊ฑด์ ์ ์ผ๋ฉด ๊ทธ ๋ถ๋ถ๋ง ์ญ์ : ํฌ์คํธ์ ๋๊ธ์ ์ฌ๋ฌ ๊ฐ ๋ฑ๋กํ๊ณ ๊ทธ ์ค ํ๋ ์ญ์ ํ๊ธฐ ๐ท ์ซ์ดํ๋ ๋ธ๋ก๊ทธ ํฌ์คํธ ํ๊ธฐ (PUT) ์ซ์ดํ๋ ๋ธ๋ก๊ทธ๊ฐ ์๋ค๋ฉด ํฌ์คํธํ ๋ธ๋ก๊ทธ๋ฅผ PUSH!!! ์ทจ์ํ๋ค๋ฉด PULL!!! ๐ท ์ฝ๋ โ controllers/blogCtrl.js const Blog = require("../models/B..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท Blog ์กฐํํ๊ธฐ (+ update) ์กฐํํ ๋๋ง๋ค ์กฐํ ์ ๋์ด๋จ! numViews~~~ 0์์ ์ญ์ญ๊พธ์ญ~~ MongoDB์์๋ ๋์ด๋๋๊ฒ ์ ๋ฐ์ดํธ ๋จ~ ๐ท ๋ชจ๋ Blog ์กฐํํ๊ธฐ ๐ท ๋ธ๋ก๊ทธ ์ญ์ ํ๊ธฐ ์ญ์ ํ id ๊ณจ๋ผ์ ์ญ์ ! ์ญ์ ํ๊ธฐ ์ ์ admin ์ธ์ง ๊ฒ์ฆํ๊ธฐ ๐ท ์ฝ๋ โ controllers/blogCtrl.js const Blog = require("../models/Blog"); const User = require("../models/User"); const asyncHandler = require("express-async-handler"); const ..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท Blog ์์ฑํ๊ธฐ ์์ฑํ๊ธฐ ์ ์, ๋ก๊ทธ์ธ๋ถํฐ ์ค์ (role์ด "admin" ์ด์ด์ผํจ) ๋ก๊ทธ์ธ ํ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ blog create ์ ๋ฃ๊ธฐ ๋๋ณด๊ธฐ ๐ ๋ชฐ๋ผ๋ ๋๊ตฌ ์์๋ ๋๊ณ ~ 1) postman์ Environment (์ผ์ชฝ ๋จ) ๋ค์ด๊ฐ๊ธฐ 2) New environment ๋๋ฌ์ ์ฃผ์ ์์ฑํ๊ธฐ 3) ์ ์๋จ์ No Envrironment ์์ New environment ๋ก ๋ฐ๊พธ๊ธฐ 4) ์์ผ๋ก ๊ท์ฐฎ๊ฒ ๊ธด API ์ฌ์ฉ์ํ๊ณ ํจ์ถ๋ {{Variable}} ์์ฑํ๋ฉด ๋จ ๐ท Blog ์์ ํ๊ธฐ update ํ๊ฑฐ์ฃต~ ๐ท์ฝ๋ โ models/Blogs const mongoos..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท Nodemailer๋ก ์ด๋ฉ์ผ ๋ณด๋ด์ ๋น๋ฐ๋ฒํธ ์ฌ์์ (PUT) ์์ฒญํ๊ธฐ โ ๋ฉ์ผ ๋ณด๋ด์ผ๋ผ์ ์ฐ ๋ด ๋ฉ์ผ๋ก ํ์๊ฐ์ ํ๊ธฐ โ ๋น๋ฐ๋ฒํธ ์ฌ์์ฑํ๊ธฐ ์ํ ํ ํฐ ์ฌ์์ฑ ์ฌ์ฉ์์ ์ด๋ฉ์ผ๋ก ์ ์ ์ ๋ณด๋ฅผ ์ฐพ๊ณ , ๋ค์ ๋น๋ฐ๋ฒํธ ํ ํฐ์ ์ฌ๋ฐ๊ธ ํ๋ค!!! ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์ ์ด๋ฉ์ผ๋ก ํจ์ค์๋ ๋งํฌ๋ฅผ ๋ณด๋ธ๋ค by โ ์ด๋ฉ์ผ ํ์ธ ๊ทผ๋ฐ ๋๋ clink here ๋๋ฅด๋ฉด ์๋ฌ๋น ใ ใ ํ์ง๋ง postman์์๋ ๋ฌ๋ค โ postman์ผ๋ก ๋น๋ฐ๋ฒํธ ์ฌ์์ฑ ์๋ ๋น๋ฐ๋ฒํธ๋ secret ์ด์์ ์์ ๋น๋ฐ๋ฒํธ๋ changesecret -> ๋ก๊ทธ์ธ ํ๋ ์ฑ๊ณต ๐ท ์ฝ๋ โ controllers/userCtrl.j..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท ๋น๋ฐ๋ฒํธ๋ฅผ ์๊ณ ์์ ๊ฒฝ์ฐ ๋น๋ฐ๋ฒํธ ์ฌ์์ (PUT) UserSchema.pre("save", async function (next) { if (!this.isModified("password")) { next(); } // Create a new User // 1) ์ฐ์ ๋น๋ฐ๋ฒํธ ํด์ฌํ(์ํธํ) this.password = await bcrypt.hash(this.password, 12); this.passwordConfirm = undefined; next(); }); // ๋น๋ฐ๋ฒํธ ์ฌ์์ ๋ ์ง UserSchema.pre('save', function (next) {..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท Product Schema & Route & Controller ๊ตฌ์ฑ ๐ท Product Schema๋ฅผ MongoDB์ ์ ์ก (POST) ๐ท Product Schema ์กฐํ (GET) ๐ท Product ์์ (PUT) slugify : ํ ์คํธ๋ฅผ url ์ฃผ์๋ก ๋ณํํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ slug : ์ด๋ฏธ ์ป์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํจํ URL์ ์์ฑ (URL๊ณผ ์๋ฏธ์๋ ์ด๋ฆ์ ์ฌ์ฉ) npm i slugify โ ์์ ํ๊ณ ์ ํ๋ title์ slug ํํ๋ก ์ง์ด๋ฃ๊ธฐ req.body.slug = slugify(req.body.title); โ ์์ ํ๊ธฐ ์ ์ ๊ด๋ฆฌ์์ธ์ง middlewar..

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example! ๐ท logout ์ ์ฟ ํค ์ญ์ ํ๊ธฐ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์์ ํ๋ฉด ์๋ฒ์์ ์ธ์ ์ ํ๊ดดํ๊ณ ์ฟ ํค๋ฅผ ์ญ์ // ์ฟ ํค ์ญ์ res.clearCookie("refreshToken", { httpOnly : true, // ์น ์๋ฒ๋ฅผ ํตํด์๋ง cookie์ ์ ๊ทผ secure : true, // HTTPS์์๋ง cookie๋ฅผ ์ฌ์ฉ }); ์ต์ ์ค๋ช maxAge ํ์ฌ ์๊ฐ์ผ๋ก๋ถํฐ ๋ง๋ฃ ์๊ฐ์ ๋ฐ๋ฆฌ์ด(millisecond) ๋จ์๋ก ์ค์ expires Cookie์ ๋ง๋ฃ ๋ ์ง๋ฅผ GMT ์๊ฐ์ผ๋ก ์ค์ ์ง์ ๋์ด ์์ง ์๊ฑฐ๋ 0์ผ๋ก ์ง์ ๋์ด ์๋ ๊ฒฝ์ฐ session cookie๋ฅผ ์์ฑ path Coo..