2022-04-15(금) TIL

황인호·2022년 6월 7일
0

TIL 모음

목록 보기
24/119
  • 오늘 해야 할일

오늘은 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
	}
}
//미들웨어 거치면 인증이 끝남
profile
성장중인 백엔드 개발자!!

0개의 댓글