Node.js 숙련 - 4
__________________________________________________
1-12 로그인 기능 구현하기
=> < 2.3. 미들 웨어 02 >
미들웨어 기술을 사용해서 로그인 기능을 구현해 보자.
폴더 : kimminsoo -> sparta -> node_js -> learning -> second_step ->. shop_project_middleware
파일 : shop_project_middleware -> app.js
- npm init -y
- npm i express mongoose jsonwebtoken -S
- 프론트 엔드 폴더 assets 코드 스니펫에서 다운로드.
=> 새로 적용한 프론트엔드가 어떻게 동작하도록 바뀌었는지 설명.
——
// 라이브러리 가져오기 및 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
})
})
——