카테고리 없음
6주차 (3)
jaeoun0238
2024. 12. 4. 20:55
function solution(num) {
let count = 0;
// num이 1이 될 때까지 반복
while (num !== 1) {
if (count >= 500) {
return -1; // 500번 반복했으나 1이 되지 않음
}
// 짝수인 경우
if (num % 2 === 0) {
num = num / 2;
} else { // 홀수인 경우
num = num * 3 + 1;
}
count++; // 반복 횟수 증가
}
return count; // 최종 반복 횟수 반환
}
SoccerOnline 프로젝트
회원가입
// 회원가입api
/** 사용자 회원가입 API **/
router.post('/sign-up', async (req, res, next) => {
const { userID, userName, userPassword } = req.body;
try {
// 동일한 회원정보 확인하기
const sameUser = await prisma.userData.findUnique({
where: {
userID,
},
});
// 사용자 정보가 이미 존재하는 경우
if (sameUser) {
return res.status(409).json({ message: '이미 존재하는 유저입니다.' });
}
// 비밀번호 해시화 (변경된 부분)
const bcryptPassword = await bcrypt.hash(userPassword, 10); // salt rounds 추가
// userData 테이블에 사용자를 추가
const user = await prisma.userData.create({
data: {
userID,
userName,
userPassword: bcryptPassword,
userScore: 0,
userCash: 5000,
},
});
return res.status(201).json({ message: '회원가입이 완료되었습니다.' });
} catch (err) {
next(err);
// 오류 처리 시작 (변경된 부분)
// console.error(error); // 오류 로그 출력 (변경된 부분)
// return res.status(500).json({ message: '서버 오류가 발생했습니다.' }); // 오류 응답 반환 (변경된 부분)
}
});
로그인
// 로그인api
/** 로그인 API **/
router.post('/sign-in', async (req, res, next) => {
const { userID, userPassword } = req.body;
const user = await prisma.userData.findUnique({ where: { userID } });
if (!user)
return res.status(401).json({ message: '존재하지 않는 유저입니다.' });
// 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
else if (!(await bcrypt.compare(userPassword, user.userPassword)))
return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });
// 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
console.log(process.env.JWT_KEY);
const token = jwt.sign(
{
userPID: user.userPID,
},
process.env.JWT_KEY, // 비밀 키를 환경 변수에서 가져옴
{ expiresIn: '1h' }, // 토큰의 만료 시간을 설정 (1시간)
);
// 헤더로 주고받게 바꾸기
res.setHeader('authorization', `Bearer ${token}`);
return res.status(200).json({
message: '로그인 성공',
user: {
userID: user.userID,
},
});
});
authorization.middleware
// src/middlewares/auth.middleware.js
// 일단 붙여놓기함
// 모듈 가져오기
import jwt from 'jsonwebtoken';
import { prisma } from '../uts/prisma/index.js';
// 미들웨어 함수 정의
export default async function (req, res, next) {
// 토큰 확인
try {
const authorization = req.headers['authorization'];
if (!authorization) throw new Error('토큰이 존재하지 않습니다.');
// 토큰 타입 및 값 분리
const [tokenType, token] = authorization.split(' ');
if (tokenType !== 'Bearer')
throw new Error('토큰 타입이 일치하지 않습니다.');
// 토큰 검증
const decodedToken = jwt.verify(token, process.env.JWT_KEY); //env 파일에있음
const userPID = decodedToken.userPID;
// 사용자 조회
const user = await prisma.userData.findUnique({
where: { userPID: userPID },
});
if (!user) {
res.clearCookie('authorization');
throw new Error('토큰 사용자가 존재하지 않습니다.');
}
// req.user에 사용자 정보를 저장
req.user = user;
next();
// 오류 처리
} catch (error) {
res.clearCookie('authorization');
// 토큰이 만료되었거나, 조작되었을 때, 에러 메시지를 다르게 출력합니다
switch (error.name) {
case 'TokenExpiredError':
return res.status(401).json({ message: '토큰이 만료되었습니다.' });
case 'JsonWebTokenError':
return res.status(401).json({ message: '토큰이 조작되었습니다.' });
default:
return res
.status(401)
.json({ message: error.message ?? '비정상적인 요청입니다.' });
}
}
}
env파일은 app.js 한군데에 있다.
여러군데에 넣으면 오류가 난다는 사실..!!
꼭꼭 확인하기
이러한 불상사가 일어났는데
사실은 db 업데이트를 안해서 일어난 일이었던것..
npx prisma db push를 잘 쓰자...