신나는 오류해결파티!!!

[API오류] type:"cors" 오류

Jenner 2023. 1. 12. 23:18

문제발생 : 

공공API를 활용하여 미세먼지 알리미를 만드는 도중에

API 요청을 통해 데이터를 받아오려고 하였으나, type 부분에 "cors"로 설정되어 

데이터를 가져오지 못하였다. 

 

주의사항:

해당 오류는 type이 cors라고 되어있기 때문에 CORS오류라고 착각할 수 있으나,  

그것과는 조금 다르다. 

 

 

 

 

위의 오류를 발생시킨 잘못된 코드 

 

const Weather = () => {
  const [isLoading, setIsLoading] = useState();
  const API_KEY = process.env.REACT_APP_API_KEY;
  const url = `https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?serviceKey=${API_KEY}&returnType=json&numOfRows=100&pageNo=1&sidoName=경기&ver=1.3`;
  useEffect(() => {
    fetch(url).then((response) => {
      return console.log(response);
    });
  }, [url]);
  return <p>웨더</p>;
};
export default Weather;

 

useEffect안에서 그냥 fetch를 하고 난 뒤 response를 console.log하였으나 정상 작동 되지 않았다. 

 

 

이 값은 첫 번째 확장시에 평가되었습니다. 이 값은 그 이후에 변경될 것입니다... 

 

 

json으로 변경하지 않아서 오류가 난 것인가 하고 json으로 변경하여 console.log하여 보았다. 

 

response.json()으로 수정한 코드 

const Weather = () => {
  const [isLoading, setIsLoading] = useState();
  const API_KEY = process.env.REACT_APP_API_KEY;
  const url = `https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?serviceKey=${API_KEY}&returnType=json&numOfRows=100&pageNo=1&sidoName=경기&ver=1.3`;
  useEffect(() => {
    fetch(url).then((response) => {
      return console.log(response.json());
    });
  }, [url]);
  return <p>웨더</p>;
};

 

 

console log화면

 

 

 

 

 

 

async await로 작동해본 코드 

 

import { useEffect, useState } from "react";

const Weather = () => {
  const [isLoading, setIsLoading] = useState();
  const API_KEY = process.env.REACT_APP_API_KEY;
  const url = `https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?serviceKey=${API_KEY}&returnType=json&numOfRows=100&pageNo=1&sidoName=경기&ver=1.3`;
  useEffect(() => {
    const fetchApi = async () => {
      const res = await fetch(url);
      const data = await res.json();
      console.log(data);
    };
    fetchApi();
  }, [url]);
  return <p>웨더</p>;
};
export default Weather;

 

console.log 화면

 

 

 

여기서 Promise then과 async await의 응답이 조금 다른 것을 알 수 있었다.

그것은 Promise라는 프로토타입의 객체를 상속받았기 때문? 인것 같은데 나중에 좀더 공부해봐야겠다.. 

 

 

 

결론 : 

url부분의 파라미터에 json으로 요청한것으로 된 줄 알았지만 

가져온 데이터를 다시 json으로 변경해야 했다.