본문 바로가기
Project/축구모임 홈페이지개발

[축구모임 홈페이지개발] 06/16 개발일지 Node.js / 선수스탯창 출력 완성

by 한33 2024. 6. 16.

선수 스탯창 마무리 단계에 이르렀다.

 

특성 4개를 지정된 선수에게 부여하는 기능을 구현해야한다.

 

 

위의 특성 4개인데 stats_result 컬렉션 내부에

 

 

다음과 같이 넘버링을 매겨서 해당 번호 당 알맞은 이미지 주소를 DB 안에 저장시켜놓았다.

 

그런 다음 네 개의 특성을 부여하면 해당 번호들이 저장될 것이고 반대로 불러올 때에도 번호당 알맞은 이미지 주소를

 

불러온다음 띄울 계획이다.

 

      <div class="management-container">
        <h4>선수 특성 부여</h4>
        <select class="form-select" id="chr-userID">
          <option value="박승룡">박승룡</option>
              <option value="oyt001">오연택</option>
              <option value="cjfwls34">양철진</option>
              <option value="tjrqjatn97">석범수</option>
              <option value="qkrwjd24568">장희승</option>
              <option value="saaq45">노용준</option>
              <option value="taehoon9908">안태훈</option>
              <option value="rere4581">김정훈</option>
              <option value="als123eotlr">민대식</option>
              <option value="chw7244">이찬웅</option>
              <option value="hsn972">나현수</option>
              <option value="bigstarhan33">한대규</option>
              <option value="yusjin96">유성진</option>
              <option value="ks9071">황덕현</option>
        </select>
        <div>
          <select class="form-select" id="chr-choose1">
            <option value="1">대인수비</option>
            <option value="2">두개의 심장</option>
            <option value="3">로빙 패스</option>
            <option value="4">브루저</option>
            <option value="5">사이렌</option>
            <option value="6">스피드 드리블러</option>
            <option value="7">아웃사이드 능숙</option>
            <option value="8">아크로바틱</option>
            <option value="9">유리몸</option>
            <option value="10">인터셉트</option>
            <option value="11">주발 선호</option>
            <option value="12">침착한 볼 소유</option>
            <option value="13">칩슛 선호</option>
            <option value="14">테크니컬</option>
            <option value="15">티키타카</option>
            <option value="16">파워슛</option>
            <option value="17">패스마스터</option>
            <option value="18">퍼스트 터치</option>
            <option value="19">플레이메이커</option>
            <option value="20">피네스 샷</option>
          </select>
          <select class="form-select" id="chr-choose2">
            <option value="1">대인수비</option>
            <option value="2">두개의 심장</option>
            <option value="3">로빙 패스</option>
            <option value="4">브루저</option>
            <option value="5">사이렌</option>
            <option value="6">스피드 드리블러</option>
            <option value="7">아웃사이드 능숙</option>
            <option value="8">아크로바틱</option>
            <option value="9">유리몸</option>
            <option value="10">인터셉트</option>
            <option value="11">주발 선호</option>
            <option value="12">침착한 볼 소유</option>
            <option value="13">칩슛 선호</option>
            <option value="14">테크니컬</option>
            <option value="15">티키타카</option>
            <option value="16">파워슛</option>
            <option value="17">패스마스터</option>
            <option value="18">퍼스트 터치</option>
            <option value="19">플레이메이커</option>
            <option value="20">피네스 샷</option>
          </select>
          <select class="form-select" id="chr-choose3">
            <option value="1">대인수비</option>
            <option value="2">두개의 심장</option>
            <option value="3">로빙 패스</option>
            <option value="4">브루저</option>
            <option value="5">사이렌</option>
            <option value="6">스피드 드리블러</option>
            <option value="7">아웃사이드 능숙</option>
            <option value="8">아크로바틱</option>
            <option value="9">유리몸</option>
            <option value="10">인터셉트</option>
            <option value="11">주발 선호</option>
            <option value="12">침착한 볼 소유</option>
            <option value="13">칩슛 선호</option>
            <option value="14">테크니컬</option>
            <option value="15">티키타카</option>
            <option value="16">파워슛</option>
            <option value="17">패스마스터</option>
            <option value="18">퍼스트 터치</option>
            <option value="19">플레이메이커</option>
            <option value="20">피네스 샷</option>
          </select>
          <select class="form-select" id="chr-choose4">
            <option value="1">대인수비</option>
            <option value="2">두개의 심장</option>
            <option value="3">로빙 패스</option>
            <option value="4">브루저</option>
            <option value="5">사이렌</option>
            <option value="6">스피드 드리블러</option>
            <option value="7">아웃사이드 능숙</option>
            <option value="8">아크로바틱</option>
            <option value="9">유리몸</option>
            <option value="10">인터셉트</option>
            <option value="11">주발 선호</option>
            <option value="12">침착한 볼 소유</option>
            <option value="13">칩슛 선호</option>
            <option value="14">테크니컬</option>
            <option value="15">티키타카</option>
            <option value="16">파워슛</option>
            <option value="17">패스마스터</option>
            <option value="18">퍼스트 터치</option>
            <option value="19">플레이메이커</option>
            <option value="20">피네스 샷</option>
          </select>
          <button class="btn btn-primary" onclick="ChrStat()">등록</button>
        </div>

      </div>

 

 

    function ChrStat() {
      var userID = document.getElementById("chr-userID");
      var chr1 = document.getElementById("chr-choose1");
      var chr2 = document.getElementById("chr-choose2");
      var chr3 = document.getElementById("chr-choose3");
      var chr4 = document.getElementById("chr-choose4");
      var chr = [chr1, chr2, chr3, chr4]


      location.href = `/ChrStat?userID=${encodeURIComponent(userID)}&chr=${encodeURIComponent(chr)}`;
    }

 

위와 같이 저장해서  서버에서 출력시키니까

 

app.get('/ChrStat', async (req, res) => {


  let result = {
    userID: req.query.userID,
    chr: req.query.chr
  };

  console.log(result)
  res.redirect('/');
});

 

{
  userID: '[object HTMLSelectElement]',
  chr: '[object HTMLSelectElement],[object HTMLSelectElement],[object HTMLSelectElement],[object HTMLSelectElement]'
}

이와 같이 출력되었다.

 

    function ChrStat() {
      var userID = document.getElementById("chr-userID").value;
      var chr1 = document.getElementById("chr-choose1").value;
      var chr2 = document.getElementById("chr-choose2").value;
      var chr3 = document.getElementById("chr-choose3").value;
      var chr4 = document.getElementById("chr-choose4").value;
      var chr = [chr1, chr2, chr3, chr4]


      location.href = `/ChrStat?userID=${encodeURIComponent(userID)}&chr=${encodeURIComponent(chr)}`;
    }

 

value 를 넣어서 값으로 바꿔줬다.

 

app.get('/ChrStat', async (req, res) => {
  try {
    let userID = req.query.userID;
    let chr = req.query.chr.split(','); // 쉼표로 구분된 문자열을 배열로 변환

    // stats_result 컬렉션에서 문서를 업데이트
    let result = await db.collection('stats_result').updateOne(
      { userID: userID }, // 필터: 해당 userID를 가진 문서를 찾음
      { $set: { chr: chr } } // 업데이트: chr 필드를 새로운 값으로 설정
    );
    console.log(result)
    res.redirect('back');
  } catch (error) {
    console.error('stats_result 업데이트 중 오류 발생:', error.message);
    res.status(500).send('내부 서버 오류');
  }
});

 

서버측에서 위와 같이 코드를 짜줬는데,  업데이트가 안되었다.

 

보니까 

 

    // stats_result 컬렉션에서 문서를 업데이트
    let result = await db.collection('stats_result').updateOne(
      { userID: userID }, // 필터: 해당 userID를 가진 문서를 찾음
      { $set: { chr: chr } }, // 업데이트: chr 필드를 새로운 값으로 설정
      { upsert: true } // 옵션: 문서가 존재하지 않으면 새로 삽입
    );

 

upsert 를 설정해줘야 문서가 존재하지 않으면 새로 삽입이 된다.