3월 20일 공부일기#

이건우·2021년 3월 20일
0

TiL

목록 보기
14/72

오늘 간단히 돔구현에 대해 다시 연습해보았다.

Uncaught (in promise) TypeError: Cannot read property 'appendChild' of null

이런 오류가 났었고,
코드는 다음과 같았다.

const githubID = 'LeeGeonWoo22' // 여러분의 아이디로 바꿔주세요

const app = {
  server: `http://3.36.72.17:3000/${githubID}/messages`,
  init : () => {
     app.fetch()
     .then((data) => {
       console.log(data)
      data.forEach((element) =>{
        app.renderMessage(element)
      });
    });
    
    // 1. app.fetch 에서 데이터를 체이닝한다.
    // 2. 체이닝해서 가져온 data를 반복문으로 돌려서
    // 3. renderMessage(data)
},
  
  fetch: () => {
   return window.fetch(app.server)
      .then(res => res.json())
      .then(data => {
     // console.log(data)
     return data
   })
}, 


  send: (data) => { // data, callback
    window.fetch(app.server, {
      method: 'post', 
      body: JSON.stringify(data)
    })
    .then(res => res.json())
    .then(data);
  },
  clearMessages: () => {
  document.querySelector("#chats").innerHTML=""

  },

  renderMessage: (element) =>{
    let div = document.createElement("div")
    let roomTag = document.createElement("div")
    let dateTag = document.createElement("div")
    let textTag = document.createElement("div")

    let chats = document.querySelector("#chats")
    let room =  document.querySelector("#room")
    let date = document.querySelector("#date")
    let text = document.querySelector("#text")
    

    div.id = "chats"
    roomTag.id = "room"
    dateTag.id = "date"
    textTag.id = "text"

    chats.appendChild(div)
    div.append(room, date, text)
    
    room.textContent = element.roomname;
    date.textContent = element.date;
    text.textContent = element.text;
    // document.querySelector("#chatter").innerHTML;
  }
}

app.init(); 

// 테스트를 위한 코드입니다. 아래 내용은 지우지 마세요
if(window.isNodeENV){
  module.exports = app;
}

문제를 어떻게 해결하였는가 ?

내가 상당히기초적이고 바보같은 실수를 하였다.
dom을 몇번안하고 잊어버린 탓이다..

  renderMessage: (element) =>{
    let div = document.createElement("div")
    let roomTag = document.createElement("div")// 정보가 들어갈 엘레먼트를 생성 하셨습니다.
    let dateTag = document.createElement("div")
    let textTag = document.createElement("div")
    
    // 생성하신 엘레먼트에 아이디를  부여합니다. 하지만 채터박스에서 메세지를 여러개 생성할것을 생각해보면
// 아이디보다는 클래스로 부여하는게 좋지 않을까요?
    div.id = "chats"
    roomTag.id = "room"
    dateTag.id = "date"
    textTag.id = "text"
    
    chats.appendChild(div) // 이부분에 만약 문제가 있다면 chats 참조하는 부분이 동작하지 않았다는것인데.. 
//그것은 해당 html에 chats 아이디를 가진 엘레멘트가 없다는것으로 생각 됩니다. 
//그러니 html을 확인해보시는것은 어떨지 여쭈어 봅니다. 우선 제경우는 이부분에서 문제를 발생하지는 않았습니다.
    div.append(roomTag, dateTag, textTag)
// 에러의 장소는 이밑 구절입니다. 이유는 위에서 적었듯이 이미존재하는 대상을 불러 오는 데. 
 //아마 기존의 html 이라면 기존에 생성된 것이 없을 것입니다. 
//해서 아마도 불러 온것이 없기때문에 room, date, text는 null을 가질것으로 생각합니다.
    roomTag.textContent = element.roomname;// 그래서 null의 textContent는 없기에 오류를 일으킵니다.
    dateTag.textContent = new Date()
    textTag.textContent = element.text;
  }

아래와같이 바꿨으며.. 나는 '아이디 선택자'에 죽어라 추가해 놓는 경우였으니 당연히 null값이 나올수 밖에.. 없는노릇이다.. 이거 dom다시 공부해봐야할 필요성이 생긴다.

profile
내가 느낌만알고 한줄도 설명할줄 모른다면 '모르는 것'이다.

0개의 댓글