Inflearn brand logo image

인프런 커뮤니티 질문&답변

isbcom1004님의 프로필 이미지
isbcom1004

작성한 질문수

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

[재 질문]Cannot read properties of undefined (reading 'map') TypeError: Cannot read properties of undefined (reading 'map') 에러 해결 어떻게 하나요?

작성

·

36

0

현재 [그랩마켓] React로 웹 개발하기 -2 듣고 있는데요,
1.
그랩 선생님 소스 코드와 동일하게 아래 작성한 index.js 소스 첨부하는데요,
실행하면,
1초 동안 잠깐 판매되는 상품들 이미지 없이 전체 페이지 뜨다 바로 아래 첨부한 그림과 같이
에러가 발생
합니다.

grabmarket map error.jpg.webp

이 에러는 어떻게 해결 할 수 있을까요?

--------
2. index.js 소스 아래에 작성 첨부 합니다.

import './index.css';
import axios from "axios";
import React from 'react';

function MainPage(){
    const [products, setProducts]=React.useState([]);
    React.useEffect(
        function(){
            axios.get("이곳에는 제 목 mock 서버 주소를 넣었습니다/products")
            .then(function(result){
                const products=result.data.products;
                setProducts(products);
            }).catch(function(error){
                console.error("에러 발생:",error);
            });
    },[]); return ( 
        <div>    
        <div id="header">
        <div id="header-area">
            <img src="../images/icons/logo.png" />
        </div>
    </div>
    <div id="body">
        <div id="banner">
            <img src="../images/banners/banner1.png" />
        </div>
        <h1>판매되는 상품들</h1>
        <div id="product-list">
            
            {
                 products.map(function(product, index){
            
                    return ( 

                <div className="product-card">
                
                <div>

                <img className="product-img" src={product.imageUrl} />
                </div>
            <div className="product-contents">
                <span className="product-name">{product.name}
                </span>
                <span className="product-price">{product.price}원
                </span>
                <span className="product-seller">
                    <img className="product-avatar" src="../images/icons/avatar.png" />
                    <span>{product.seller}</span>
                </span>
            </div>
            </div>

        ); 
                }) 
            }
        
        </div>
        </div>
    
    <div id="footer"></div>
    </div>
    );
}

export default MainPage;

그리고, 추가적으로 아래 그랩님 답변 본 뒤 다시 시도해 본 후 질문이 있어 추가적으로 글을 적습니다.

현재 postman을 실행하고요, 제 해당 목 mock 서버 주소를 입력 후 끝에 /products까지
하면요, 아래와 첨부한 사진과 같이 잘 데이터를 받아오는 것 같은데요, 위에 에러 화면이 그대로 표시되어 어떻게 해결해야 하는지 방법을 모르겠습니다. 조금 구체적으로 어떻게 해결해야 하는지 단계별로 친절한 설명 부탁드립니다.

grabmarket map error mock server url data okay.jpg.webp

 

grabmarket mock server error default.jpg.webp

 

grabmarket mock server error get products.jpg.webp


답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

isbcom1004님, 현재 발생하는 에러는 products 객체가 정의되지 않을 때 map 함수를 사용하려고 해서 발생하는 문제입니다. 이 문제는 서버에서 데이터를 받을 때 네트워크 지연이나, 데이터 포맷이 예상과 다를 경우에 발생할 수 있습니다. 아래 단계별로 몇 가지 해결 방법을 제안드립니다.

  1. 초기 값 설정: useState의 초기값으로 빈 배열([])을 설정하여 렌더링 중 products가 항상 배열임을 보장해야 합니다. 이는 현재 소스코드에서 이미 구현되어 있습니다.

  2. 데이터 형 체크 및 방어적 처리: API 요청 후 setProducts를 호출하기 전에 데이터를 검사합니다.

    axios.get("https://your-mock-server/products")
    .then(function (result) {
        const products = result.data.products;
        if (Array.isArray(products)) {
            setProducts(products);
        } else {
            console.error("API error: 'products' is not an array.");
        }
    })
    .catch(function (error) {
        console.error("에러 발생:", error);
    });
    
  3. 조건 렌더링: products가 배열인지 확인하여 조건 렌더링을 추가합니다. 배열이 아닐 때 안전하게 렌더링되도록 조치합니다.

    {products && Array.isArray(products) && products.map(function (product, index) {
        // map 코드
    })}
    
  4. 디버깅 및 콘솔 로그: result.data.products가 원하는 형식인지 콘솔 로그를 통해 확인하세요.

    console.log(result.data.products);
    

이를 통해 문제의 원인을 찾고 해결할 수 있을 것입니다. 추가적으로 Postman에서 API 결과가 정상적으로 나오는 것을 확인하셨다면, 네트워크 요청이 프론트 쪽에서 제대로 반영되는지 확인해보세요.

해당 방법으로 문제가 해결되지 않거나 추가적인 질문이 있다면 언제든지 문의해 주세요. 도움이 되셨길 바랍니다.

isbcom1004님의 프로필 이미지
isbcom1004
질문자

(AI 인턴님과 그랩님께 부탁 드립니다.)
AI 인턴이 알려준 위 2번,3번,4번 소스 코드를 어느 자리에 각각 붙여 넣어야 하는지,
또는 AI 인턴이 알려준 2번,3번,4번 소스 코드를 제가 첨부한 index.js 소스 어디에 붙여 넣어 최종 완성된 수십 줄의 소스 코드를 아래 답변 댓글에 길더라도 다 첨부해주시면 완성된 소스 코드를 그대로 복사하여 vs code에 붙여 넣기 하고 싶은데요, 빠른 시일 내에
답변 주실 수 있다면 좋겠습니다.

isbcom1004님의 프로필 이미지
isbcom1004

작성한 질문수

질문하기