오늘은 Clone Coding 시작일이다.
우리 조는 Youtube를 클론코딩하기로했다.
나는 회원가입&로그인 과 구독기능 API를 설계를 맡았다.
우리팀에 동선님이라고 엄청 잘하시는 분이계신데...혼자서 다하신덴다.....
나는 저거어떻게하는지 모르겠는데....
내가 설계한 로그인 회원가입기능을 적어놓겠다.
User가 회원가입 요청시 사용하는 API
router.post("/signup", async(req,res)=> {
const {userId, userPw, userNick} = req.body
//동일한 계정이 존재하는지 찾는 변수이다.
const existUsers = await User.findOne({userId})
if (existUsers) {
res.status(400).send({
errorMessage:"중복된 아이디입니다."
})
return
}
//
await User.create({userId,userPw,userNick})
console.log(`${userId}님이 회원가입하셨습니다.`)
res.status(200).send({result : true})
})
User가 로그인 요청시 사용하는 API입니다.
router.post("/login", async(req,res) => {
const {userId,userPw} = req.body
const user = await User.findOne{userId,userPw}
if (!user) {
res.status(400).send({
errorMessage:"아이디와 비밀번호를 확인해주세요"
})
return
}
//userInfo : 아이디,비밀번호등 사용자 정보 Object
//expiresIn : 토큰 만료일,issuer,subject : 토큰에 대한 정보
const options = {expiresIn:"1d",issuer:"CloneProject",subject:"userInfo"}
const payload = {userId}
const secret = myKey
//jwt.sign()은 비동기 함수이다.
const token = jwt.sign(payload)
res.json({result:true, loginToken:token})
app.js셋팅하는 방법
const express = require('express')
// connect는 요청을 처리하기 위해 다양한 미들웨어를 결합하는 간단한 프레임워크입니다.
const connect = require('connect')
const cookieParser = require('cookie-parser')
const cors = require('cors')
const app = express()
const port = 3000
connect()
//라우터 불러오기
//routers 폴더를 만들고 파일명{posts,likes,search,comments,users,subscribe}
const postRouter = require('./routers/posts')
const likeRouter = require('./routets/likes')
const searchRouter = require('./router/search')
const commentRouter = require('./routers/comments')
const userRouter = require('./routers/users')
const subcribeRouter = require('./routers/subscribe')
//접속 로그 남기기
const requestMiddleware = (req,res,next)=> {
console.log(
//ip주소를 요청
"[Ip adress]",
req.ip,
// CRUD 어떻게 했는지 요청
"[method]",
req.method,
// CRUD API 주소 요청
"Request URL:",
req.originalUrl,
" - ",
// 시간 요청
new Date()
)
next()
}
//각종 미들웨어
app.use(cors())
// express.json() 과 express.urlencoded() 를 쓰는 이유
// 클라이언트로 부터 받은 http요청 메시지 형식에서 body데이터를 해석하기위해서
// express.json() 과 express.urlencoded() 로 처리가 필요합니다.
app.use(express.json())
//false를 하는 이유 => Object와 값을 둘다 가져오기때문이다.
app.use(express.urlencoded({extended : false}))
app.use(cookieParser())
app.use(requestMiddleware)
app.use(express.urlencoded({extended:false})
//라우터 연결
app.use("/api",[postRouter,
likeRouter,
searchRouter,
commentRouter,
subcribeRouter])
app.use("/user",[userRouter]
//서버 열기
app.listen(port, ()=> {
console.log(port,"포트로 서버가 켜졌습니다!")
})
여기서 잠깐 express.json() 과 express.urlencoded()를 쓰는 이유는 뭘까...??
https://kirkim.github.io/javascript/2021/10/16/body_parser.html
내용을 간추리자면
express.json() 과 express.urlencoded()는 클라이언트로부터 받은 http요청 메시지 형식에서 body데이터를 해석하기 위해서이다.
express.urlencoded( ) : 폼으로 제출된 내용을 사용할때 필요하다.
결론
.urlencoded( )는 x-www-form-urlencoded형태의 데이터를
.json( ) 는 JSON형태의 데이터를 해석해줍니다.
또! res.sendFile() : 임시로 만든 html페이지를 응답으로 보내주어 클라이언트 화면에 출력되도록함
미들웨어 코드
const jwt = require('jsonwebtoken')
const User = require('../schemas/user')
const fs = require('fs')
const myKey = fs.readFileSync(__dirname + "/key.txt").toString()
module.exports = (req, res, next)=> {
const Token = req.headers.authorization
const logInToken = Token.replace("Bearer","")
try {
const token = kwt.verify(logInToken, myKey)
const userId = token.userId
User.findOne({userId}).exec().then((user)=>{
res.local.user = user
//로컬의 DB에 있는 유저 정보를 가지고 있음
res.local.token = logInToken
//로컬에 존재하는 로그인 토큰
next()
})
}catch (error) {
console.log("여기서 에러난거같음")
res.status(401).json({result:"토큰이 유효하지 않습니다."})
return
}
}
//미들웨어 거치면 인증이 끝남