카테고리 없음

내일배움캠프 10주차 월요일 TIL

news0516 2024. 12. 30. 21:07

userProfile 페이지에 저장한 프로필 정보를 가져와 띄우기 위해 파일 코드를 수정하였다.

// static/userProfile/userProfile.hmtl
...  
<div id="container">
    <div id="main1">
	// profile 정보 띄우는 곳
      <div id="profile"></div>
      <button id="enterChat">채팅에 들어가기</button>
    </div>
    <div id="main2">
      <div id="chat">
        <!-- 채팅 메시지 영역 -->
      </div>
      <div>
        <input type="text" id="test" placeholder="메시지를 입력해주세요..">
        <button onclick="send()">전송</button>
      </div>
    </div>
  </div>
...


일단 프로필 저장 버튼을 통해 로그인한 userId에 프로필 정보를 저장하는 API를 구성하였다.

router.post('/save-profile', authMiddleware, async (req, res) => {
	// 인증을 통한 userId 판별
  const { userId } = req.user;
	// 입력창에서 받은 정보
  const {
    lolNickname, profileImage, tier, line, mostPlay1, mostPlay2, mostPlay3,
  } = req.body;

  const userID = req.user.userId; 
  if (!userId) {return res.status(401).json({ message: '인증된 사용자 정보가 필요합니다.' });
  }

...
  // 데이터 유효성 검사
...

  try {
    const userExists = await prisma.users.findUnique({
      where: { userId: userID },
    });

    if (!userExists) {
      return res.status(404).json({ message: '사용자를 찾을 수 없습니다.' });
    }

    // 챔피언 이름으로 ID 조회
    const mostPlay1Champion = await prisma.champions.findUnique({
      where: { name: mostPlay1 },
	});
    const mostPlay2Champion = await prisma.champions.findUnique({
      where: { name: mostPlay2 },
    });
    const mostPlay3Champion = await prisma.champions.findUnique({
      where: { name: mostPlay3 },
    });

    // 챔피언 ID가 존재하는지 확인
    if (!mostPlay1Champion || !mostPlay2Champion || !mostPlay3Champion) {
      return res.status(404).json({ message: '챔피언을 찾을 수 없습니다.' });
    }

    // 프로필 데이터베이스에 저장
    const newProfile = await prisma.profiles.create({
      data: {
        lolNickname,
        profileImage,
        tier,
        line,
        mostPlay1: mostPlay1Champion.name,
        mostPlay2: mostPlay2Champion.name,
        mostPlay3: mostPlay3Champion.name,
        user: {
          connect: { userId: userId }, // 사용자 연결
        },
      },
    });
// error 처리
...

 

해당 화면에서 Riot API를 통한 조회 정보, 직접 입력한 정보를 받아 프로필 생성에 쓴다.


이후 프로필 저장 버튼을 클릭하면 userId에 따라 profile 정보가 생성된다.
이후 userProfile페이지에서 특정 사용자의 프로필 정보를 가져오는 과정이 필요하다. userId는 URL 끝 파라미터로 판단한다.

// 특정 사용자의 프로필 정보 가져오기
router.get('/profile/:userId', async (req, res) => {
  const userId = parseInt(req.params.userId); // URL에서 userId 가져오기

  try {
    const profile = await prisma.profiles.findFirst({
      where: {
        userId: userId,
      },
      include: {
        user: true,
      },
    });

    if (!profile) {
      return res.status(404).json({ message: '프로필을 찾을 수 없습니다.' });
    }

    res.json(profile);
  } catch (error) {
    console.error('프로필 정보를 불러오는 중 오류 발생:', error);
    res
      .status(500)
      .json({ message: '프로필 정보를 불러오는 중 오류가 발생했습니다.' });
  }
});

해당 라우터가 호출되어 db에 저장된 프로필정보를 클라리언트에 전달한다.

// static/userProfile/userProfile.js
// 현재 URL에서 사용자 ID 추출
  const userId = window.location.pathname.split('/').pop(); // URL의 마지막 부분을 가져옴
  try {
    // 프로필 데이터 가져오기
    const response = await fetch(`/api/profile/${userId}`);
    if (!response.ok) {
      throw new Error('프로필 정보를 불러올 수 없습니다.');
    }
    const profile = await response.json();
    // 프로필 정보 렌더링
    const profileContainer = document.getElementById('profile');
    profileContainer.innerHTML = `
      <div class="profile-details">
        <img src="${profile.profileImage || '/static/default-avatar.png'}" alt="프로필 이미지" />
        <h3>${profile.lolNickname}</h3>
        <p>티어: ${profile.tier}</p>
        <p>라인: ${profile.line}</p>
        <p>대표 챔피언: ${profile.mostPlay1}, ${profile.mostPlay2}, ${profile.mostPlay3}</p>
      </div>
    `;
  } catch (error) {
    console.error('프로필 데이터를 불러오는 중 오류 발생:', error);
  }

프로필 이미지, 닉네임, 티어, 라인, 대표 챔피언 정보를 포함한 HTML을 생성하여 페이지에 표시한다.

localhost/8080/userProfile/1

userId : 1 인 유저에 저장된 프로필 정보가 html에서도 잘  표시되고 있다. 같은 userProfile.js에 의해 구동되는 채팅 기능도 이전과 같이 잘 작동하는 것을 확인했다.


이후 해야할 것.
- 팀원들 프론트엔드 구동 확인, 링크 연결 수정
- 발표자료 준비(구조 도식화, 트러블슈팅 등)
- 배포

휴일인 수요일날 최대한 마무리 작업만 할 수 있게 내일 많은것을 토의와 함께 끝내야 한다...