๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[E-Commerce App with REST API] (10) ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์ฐ ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ (POST) & ๋น๋ฐ๋ฒํธ ์ฌ์์ (PUT) ๋ณธ๋ฌธ
[E-Commerce App with REST API] (10) ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์ฐ ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ (POST) & ๋น๋ฐ๋ฒํธ ์ฌ์์ (PUT)
์ง์ง์ํ์นด 2023. 3. 29. 01:29<๋ณธ ๋ธ๋ก๊ทธ๋ Developers Corner ์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> 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.js
// ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ
const forgotPasswordToken = asyncHandler(async (req, res) => {
const { email } = req.body;
const user = await User.findOne({ email });
// ์ฌ์ฉ์๊ฐ ์๋ค๋ฉด
if (!user) {
throw new Error("User not found with this email");
}
try {
// user schema ์์ ๋ค์ ํ ํฐ ์ฌ๋ฐ๊ธ
const token = await user.createPasswordResetToken();
await user.save();
const resetURL = `Plz, follow this link to reset your password! This is vaild till 10 minutes. <a href='http://localhost:3000/api/user/reset-password/${token}'>Click here</>`
const data = {
to: email,
text: "Hi User!",
subject: "Forgot password link",
html: resetURL
}
sendEmail(data);
res.json(token);
} catch (error) {
throw new Error(error);
}
});
// ๋น๋ฐ๋ฒํธ ์ฌ์์ฑ
const resetPassword = asyncHandler(async (req, res) => {
const { password } = req.body;
const { token } = req.params;
const hasedToken = crypto.createHash("sha256").update(token).digest("hex");
console.log(password);
const user = await User.findOne({
passwordResetToken: hasedToken,
passwordResetExpires: { $gt: Date.now() },
});
if (!user) {
throw new Error("Token Expired! Plz try again here");
}
user.password = password;
user.passwordResetToken = undefined;
user.passwordResetExpires = undefined;
await user.save();
res.json(user);
});
โ controllers/emailCtrl.js
const nodemailer = require("nodemailer");
const asyncHandler = require("express-async-handler");
require("dotenv").config();
const sendEmail = asyncHandler(async (data, req, res) => {
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: process.env.MAIL_ID, // generated ethereal user
pass: process.env.MP, // generated ethereal password
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: '"Fred Foo ๐ป" <foo@example.com>', // sender address
to: data.to, // list of receivers
subject: data.subject, // Subject line
text: data.text, // plain text body
html: data.html, // html body
});
console.log("Message sent: %s", info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});
module.exports = {
sendEmail
}
โ routes/authRoute.js
const express = require("express");
const router = express.Router();
const { createUser, loginCheck, getAllUsers, getAUsers, deleteAUser, updateUser, blockUser, unblockUser, handleRefreshToken, logout, updatePassword, forgotPasswordToken, resetPassword } = require("../controllers/userCtrl");
const { authMiddleware, isAdmin } = require("../middlewares/authMiddleware");
router.post("/register", createUser);
router.post("/forgot-password-token", forgotPasswordToken);
router.put("/reset-password/:token", resetPassword);
router.put("/password", authMiddleware, updatePassword);
router.post("/login", loginCheck);
router.get("/all-users", getAllUsers);
router.get("/refresh", handleRefreshToken);
router.get("/logout", logout);
router.get("/:id", authMiddleware, isAdmin, getAUsers);
router.delete("/:id", deleteAUser);
router.put("/edit-user", authMiddleware, updateUser);
router.put("/block-user/:id", authMiddleware, isAdmin, blockUser);
router.put("/unblock-user/:id", authMiddleware, isAdmin, unblockUser);
module.exports = router;