๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[E-Commerce App with REST API] (10) ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์šฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ (POST) & ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์ˆ˜์ • (PUT) ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[E-Commerce App with REST API] (10) ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์šฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ (POST) & ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์ˆ˜์ • (PUT)

์ง•์ง•์•ŒํŒŒ์นด 2023. 3. 29. 01:29
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” 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;
728x90
๋ฐ˜์‘ํ˜•
Comments