โ—ผ FrontEnd/ReactJS

[ReactJS] ๋ฐฑ์—์„œ GET method๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹นํ•  ๋•Œ ๊ฐ’์ด ์ฝํ˜€์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ - Uncaught TypeError: Cannot read properties of undefined (reading '0')

SangYoonLee (SYL) 2022. 12. 9. 12:35
๋ฐ˜์‘ํ˜•

๐Ÿšจ ๋ฌธ์ œ ์ƒํ™ฉ

ํŒ€ ํ”„๋กœ์ ํŠธ ์ค‘ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์—ฌ ๋ฐ›์€ ํ›„, ์ด ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์žˆ์—ˆ๋‹ค. ์ด ๋•Œ ์ž์ฃผ ๊ณจ์น˜๋ฅผ ์•„ํ”„๊ฒŒ ํ–ˆ๋˜ ์—๋Ÿฌ๊ฐ€ ํ•˜๋‚˜ ์žˆ์–ด ํฌ์ŠคํŠธ๋กœ ๋‚จ๊ธด๋‹ค.

 

const ReservationPage = () => {
  const [lectureData, setLectureData] = useState({});

  // ๋ฐฑ์—์„œ ์ƒํ’ˆ ๋””ํ…Œ์ผ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
  useEffect(() => {
    fetch(`/data/reservationData.json`, {
      method: 'GET',
    })
      .then(response => response.json())
      .then(data => {
        setLectureData(data);
      });
  }, []);

  if (lectureData === {}) {
    return null;
  }

  ...
}

 

์šฐ์„ , fetch ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜๋‹ค.

 

{
  "data": [
    {
      "images": "aimage",
      "lectureDate": [
        {
          "isReserved": 0,
          "lectureDate": "2022, 12, 23",
          "lectureTimeOptionId": 1
        }
      ],
      "lectureId": 1,
      "lectureText": "์œ„์Š๋žญ ์Šคํƒ€ ์…ฐํ”„ ๊น€ํ˜ธ์ค€์˜ ๋น„๋ฐ€ ๋ ˆ์‹œํ”ผ ํ›”์ณ์˜ค๊ธฐ",
      "lectureTitle": "์œ„์Š๋žญ 3์Šคํƒ€ ์‰ํ”„ ๊น€ํ˜ธ์ค€์˜ ๋น„๋ฐ€ ๋ ˆ์‹œํ”ผ",
      "lecturerName": "Georgeta",
      "price": "70000"
    }
  ]
}

 

์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ์ด์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

 

  // ๋ฐฑ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น
  const data = lectureData.data;
 
  const { lectureId, lectureTitle, lectureText, lecturerName, price, images } =
    data[0];

 

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

Uncaught TypeError: Cannot read properties of undefined (reading '0')

undefined์ธ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 


๐Ÿ’ก ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ๊ณผ์ •

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜, ๋ฐฑ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹นํ•  ๋•Œ, ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐฐ์—ด์˜ index ๊ฐ’์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๊ฐ’์ด ์ฝํ˜€์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๊ณ  ํ•œ๋‹ค.

const { lectureId, lectureTitle, lectureText, lecturerName, price, images } = data[0];

 

๋”ฐ๋ผ์„œ ๋ฐฑ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ์‹œ, ๋ฐฐ์—ด์˜ index๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฑ์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ์— ๋ฐฐ์—ด ๊ตฌ์กฐ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ์ž์ฃผ ์žˆ๋‹ค. ์ด๋Ÿด ๋• ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”๊ฐ€?

 

๋งŒ์ผ ๋ฐ์ดํ„ฐ์— ๊ผญ index๋กœ ์ ‘๊ทผํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด setState์˜ Modifier ํ•จ์ˆ˜ ์ธ์ž ๋‚ด๋ถ€์—์„œ (index๋กœ) ์ ‘๊ทผํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

const ReservationPage = () => {
    const [lectureData, setLectureData] = useState([]);
    const [reservation, setReservation] = useState('');
    const { lectureId } = useParams();

    // ๋ฐฑ์—์„œ ์ƒํ’ˆ ๋””ํ…Œ์ผ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
    useEffect(() => {
      fetch(`http://10.58.52.141:3000/lectures/${lectureId}/reservations`, {
        method: 'GET',
      })
        .then(response => response.json())
        .then(data => {
          // ์ด ๊ณณ์—์„œ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ OK
          setLectureData(data.data[0]);
        });
    }, []);

    // ๋ฐฑ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น
    const { lectureId, lectureTitle, lectureText, lecturerName, price, images } =
      lectureData;
      
    ...
  }

 


๐Ÿ’ฌ ๋Š๋‚€ ์ 

๋…ผ๋ฆฌ์ ์ธ ์ ˆ์ฐจ๋Œ€๋กœ๋ผ๋ฉด ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ์—†์ด ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•  ํ…๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์•„์„œ ์ฐธ์œผ๋กœ ๋‹ต๋‹ตํ–ˆ๋˜ ์—๋Ÿฌ์˜€๋‹ค. ๋ฉ˜ํ† ๋‹˜๋„ ์ •ํ™•ํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด์…จ๊ณ  ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ์›ํ•˜๋Š” ๋‹ต์„ ์–ป์„ ์ˆ˜ ์—†์–ด์„œ ์ฐธ์œผ๋กœ ์•„์‰ฌ์› ๋‹ค.

 

๋ฐ˜์‘ํ˜•