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

[E-Commerce App with REST API] (3) Async Request Handler ํ™œ์šฉํ•œ ์—๋Ÿฌ & bcrypt์˜ hashl, Salt ์ ์šฉ ๋ณธ๋ฌธ

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

[E-Commerce App with REST API] (3) Async Request Handler ํ™œ์šฉํ•œ ์—๋Ÿฌ & bcrypt์˜ hashl, Salt ์ ์šฉ

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

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” Developers Corner ์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> Node.js E-Commerce App with REST API: Let's Build a Real-Life Example!

 

 

๐ŸŒท Async Request Handler

async๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ

Request Handler๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๊ณตํ†ต์ ์œผ๋กœ ์˜ค๋ฅ˜์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„

npm i express-async-handler

โœ… request handler์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
- promise().catch(next)
- async function, try ~ catch, next

err ๋ฉ”์‹œ์ง€ ์˜ˆ์˜๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฑฐ ํ™•์ธ~^^

 

 

๐ŸŒท bcrypt๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ hash ์ ์šฉํ•˜๊ธฐ

๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ hash ํ•จ์ˆ˜ ์ ์šฉ๋˜์„œ ๋‚˜์˜ค๋Š”๊ฑฐ ๋ณด์…จ๋‚˜์œ ~~~?

 

๐ŸŒท ์ฝ”๋“œ

โœ… index.js

const express = require("express");
const bodyParser = require("body-parser");
const dbConnect = require("./config/dbConnect");
const {notFound, errorHandler} = require("./middlewares/errorHandler");
const app = express();
require("dotenv").config();
const PORT = process.env.PORT || 8000;

const authRouter = require("./routes/authRoute");

// mongoDB
dbConnect();
// Bodyparser
// express์„œ๋ฒ„๋กœ POST์š”์ฒญ์„ ํ•  ๋•Œ inputํƒœ๊ทธ์˜ value๋ฅผ ์ „๋‹ฌ
// URL-encoded ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋„˜์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋กœ์˜ ๋ณ€ํ™˜ ํ•„์š”
app.use(bodyParser.json());
app.use(express.urlencoded({ extended: false }));

app.use("/api/user", authRouter);

app.use(notFound);
app.use(errorHandler);

app.use("/", (req, res) => {
  res.send("hihi");
})

app.listen(PORT, () => {
    console.log(`๐Ÿš€ Server started on port http://localhost:${PORT}`);
});

 

โœ… E-CommerceApp/index.js

// not found
const notFound = (req, res, next) => {
  const error = new Error(`Not Found : ${req.originalUrl}`);
  res.status(404);
  next(error);
};

// Error Handler
// - 1xx
// : ์š”์ฒญ์„ ๋ฐ›์•˜์œผ๋ฉฐ ํ”„๋กœ์„ธ์Šค ๊ณ„์† ์ง„ํ–‰
// - 2xx
// : ์š”์ฒญ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ›์•˜์œผ๋ฉฐ ์ธ์‹ํ–ˆ๊ณ  ์ˆ˜์šฉ
// - 3xx
// : ์š”์ฒญ ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ ์ž‘์—… ์กฐ์น˜ ํ•„์š” 
// - 4xx
// : ์š”์ฒญ์˜ ๋ฌธ๋ฒ•์ด ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€๋Šฅ
// - 5xx
// : ์„œ๋ฒ„๊ฐ€ ๋ช…๋ฐฑํžˆ ์œ ํšจํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด ์ถฉ์กฑ์„ ์‹คํŒจ 
const errorHandler = (err, req, res, next) => {
  const statuscode = res.statusCode == 200 ? 500 : res.statusCode;
  res.status(statuscode);
  res.json({
    message: err?.message,
    stack: err?.stack
  });
};

module.exports = {
  notFound,
  errorHandler
};

 

โœ… controllers/userCtrl.js

const User = require("../models/User");
const bcrypt = require("bcrypt");
const asyncHandler = require("express-async-handler");

const createUser = asyncHandler(async (req, res) => {
  const { firstname, lastname, email, mobile, password } = req.body;
  const findUser = await User.findOne({ email: email });

  // email์ด db์— ์—†๋‹ค๋ฉด
  if (!findUser) {
    // Create a new User

    // 1) ์šฐ์„  ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‰ฌํ™”(์•”ํ˜ธํ™”)
    const hashedPassword = await bcrypt.hash(password, 10);
    // 2) ์ƒˆ User ์ •๋ณด ๋งŒ๋“ค๊ธฐ
    const newUser = await User.create({
      firstname, lastname, email, mobile, password: hashedPassword
    });

    res.json(newUser);
  } else {
    // User already exists
    throw new Error("User already exists");
  }
});

module.exports = { createUser };

 

728x90
๋ฐ˜์‘ํ˜•
Comments