카테고리 없음

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를 잘 쓰자...