msdou45 2022. 12. 20. 00:09

__________________________________________________

 

1-12  로그인 기능 구현하기

 

=>  < 2.3. 미들 웨어 02 >

 

미들웨어 기술을 사용해서 로그인 기능을 구현해 보자.

 

 

 

폴더 : kimminsoo -> sparta -> node_js -> learning -> second_step ->. shop_project_middleware

파일 : shop_project_middleware -> app.js

 

 

  1. npm init -y
  2. npm i express mongoose jsonwebtoken -S

 

  1. 프론트 엔드 폴더 assets 코드 스니펫에서 다운로드.

=> https://s3.ap-northeast-2.amazonaws.com/materials.spartacodingclub.kr/nodejs_advanced/week03/week2-shopping-front-end.zip

 

=> 새로 적용한 프론트엔드가 어떻게 동작하도록 바뀌었는지 설명.

 

 

 

 

——

// 라이브러리 가져오기 및 express 사용 준비. 

const express = require("express");

const mongoose = require("mongoose");

const app = express();

const jwt = require("jsonwebtoken");

const User = require("./models/user.js")

 

// mongoose 라이브러리를 사용하여 mongoDB 와 연결.

mongoose.connect("mongodb://localhost:27017/shopping-demo", {

  useNewUrlParser: true,

  useUnifiedTopology: true,

});

const db = mongoose.connection;

db.on("error", console.error.bind(console, "connection error:"));

 

// router 설정해주기. 최상위 파일에서 스스로를 router 로 감쌋어.

const router = express.Router();

 

// localhost:8080/api 로 요청할 경우, urlencoded 타입으로 들어온 데이터들을 파싱해주는 미들웨어를 거쳐서 router 로 진입.

// localhost:8080 로 진입할 경우 "assets" 라는 파일의 정적 파일들을 자동으로 서빙해준다.

app.use("/api", express.urlencoded({ extended: false }), router);

app.use(express.static("assets"));

 

app.listen(8080, () => {

  console.log("서버가 요청을 받을 준비가 됐어요");

});

——

 

 

 

 

 

 

 

 

 

 

__________________________________________________

 

1-13  회원가입 API 구현하기

 

=>  < 2.3. 미들 웨어 03 >

 

POST 메서드, /users 경로로 요청 받을수 있도록 구현

 

 

——

< app.js >

 

// 경로 : localhost:8080/api/users                회원가입 API

router.post("/users", async (req, res) => {

    const {nickname, password, confirmPassword, email} = req.body;

    // 1. 패스워드 검증.

    // 2. 동일한 email 로 가입한 사람이 있는가

    // 3. 동일한 nickname 으로 가입한 사람이 있는가

    // 4. 실제로 DB에 user 정보를 insert 

 

    if (password !== confirmPassword) {

        return res.status(400).json({errorMessage: "패스워드가 일치하지 않습니다."})

    }

 

    const existUser = await User.findOne({$or: [{email: email}, {nickname: nickname}]});

                    // [] 안에 있는 값들 중에 하나라도 일치 한다면 해당 도큐먼트(레코드)를 보여주겠다. {} 형태로

 

    console.log("존재하는가? " + existUser)

    if (existUser) {        // findOne() 의 경우 없으면 null 로 들어올거야 아마.

        return res.status(400).json({errorMessage: "이메일 혹은 닉네임이 이미 사용중 입니다."})

    }

 

    const user = new User({nickname, email, password});

    await user.save();

 

    res.status(201).json({});       // 201 은 create 를 했다는 의미의 상태 코드.

})

——

 

 

 

 

 

 

 

 

__________________________________________________

 

1-14  로그인 API 구현하기

 

=>  < 2.3. 미들 웨어 04 >

 

POST 메서드, /auth 경로로 요청 받을수 있도록 구현

 

 

——

< app.js >

 

 

// 경로 : localhost:8080/api/auth             로그인 API

router.post("/auth", async (req, res) => {

    const {email, password} = req.body;

 

    const user = await User.findOne({email})

            // 특정 사용자 한 명만 찾는다. 누구를? email 이 같은 사람. email 은 유니크 값. 있으면 {}, 없으면 null

    if (!user || password !== user.password) {  

            // 입력받은 이메일의 user가 없다면, 즉 null 이거나 해당 user의 비밀번호와 입력받은 비밀번호가 다른 경우.

        return res.status(400).json({errorMessage: "아이디 혹은 비밀번호가 다릅니다...."})

    }

    const token = jwt.sign({userId: user.userId}, "sparta-secret-key")  // find 로 가져올 때 virtual 덕분에 userId 라는 필드가 생김.

 

    res.status(200).json({

        "token": token

    })

})

——