인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이 규성님의 프로필 이미지
이 규성

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

▶ HTTP 프로토콜

날씨 API 코드 오류

작성

·

19

0

const weatherSearch = function (position) {
  console.log(position);
  fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${position.latitude}&lon=${position.longitude}&appid=9756434244216c3d2f9c08591b54bede`)
}

// 위치 정보를 처리하는 함수
const acessToGeo = function (position) {
  const positionObj = {
    latitude: position.coords.latitude, // 위도
    longitube: position.coords.longitude // 경도 (오타: longitube → longitude)
  };
  console.log(positionObj); // 위치 정보 출력
  console.log(position); // 전체 위치 데이터 출력
  weatherSearch(positionObj)
};

2.5로 수정햇는데 오류가 뜨네요 어떠한 오류인 지 모르겠습니다 밑 코드는

// DOM 요소 선택
const todoInput = document.querySelector("#todo-input"); // 할 일 입력 필드
const todoList = document.querySelector("#todo-list"); // 할 일 목록

// localStorage에서 저장된 데이터를 불러오기
const savedTodoList = JSON.parse(
  localStorage.getItem("saved-items")
); /* 문자열로 저장된 데이터를 JSON.parse를 통해 배열로 변환 */

// 새로운 할 일을 생성하는 함수
const createTodo = function (storageData) {
  let todoContents = todoInput.value; // 입력 필드에서 가져온 값

  if (storageData) {
    todoContents = storageData.contents; // 저장된 데이터가 있으면 그 내용을 사용
  }

  // 할 일을 나타내는 DOM 요소 생성
  const newLi = document.createElement("li"); // li 요소 생성
  const newSpan = document.createElement("span"); // span 요소 생성 (할 일 내용 표시)
  const newBtn = document.createElement("button"); // 완료 버튼 생성

  // 완료 버튼 클릭 시 해당 할 일을 완료 상태로 변경
  newBtn.addEventListener("click", () => {
    newLi.classList.toggle("complete"); // 완료된 상태를 토글
    saveItemsFn(); // 변경 내용을 저장
  });

  // 할 일을 더블클릭하면 삭제
  newLi.addEventListener("dblclick", () => {
    newLi.remove(); // li 요소 제거
    saveItemsFn(); // 변경 내용을 저장
  });

  // 저장된 데이터가 완료 상태면 완료 표시 추가
  if (storageData?.complete) {
    // 옵셔널 체이닝 사용
    newLi.classList.add("complete"); // 완료 클래스 추가
  }

  // 할 일 내용을 span에 추가
  newSpan.textContent = todoContents;
  // li 요소에 버튼과 span을 자식으로 추가
  newLi.appendChild(newBtn);
  newLi.appendChild(newSpan);
  // 할 일 목록에 li 추가
  todoList.appendChild(newLi);

  // 입력 필드를 비우기
  todoContents.value = "";
  // 변경된 목록 저장
  saveItemsFn();
};

// Enter 키를 눌렀을 때 할 일 추가
const keyCodeCheck = function () {
  if (window.event.keyCode === 13 && todoInput.value !== "") {
    createTodo(); // 입력값이 있으면 할 일을 생성
  }
};

// 전체 삭제 기능
const deleteAll = function () {
  const liList = document.querySelectorAll("li"); // 모든 li 요소 선택
  for (let i = 0; i < liList.length; i++) {
    liList[i].remove(); // 모든 할 일 제거
  }
  saveItemsFn(); // 변경 사항 저장
};

// localStorage에 저장하는 함수
const saveItemsFn = function () {
  const saveItems = []; // 저장할 데이터를 담을 배열

  // 현재 목록의 할 일들을 객체로 변환하여 저장
  for (let i = 0; i < todoList.children.length; i++) {
    const todoObj = {
      contents: todoList.children[i].querySelector("span").textContent, // 할 일 내용
      complete: todoList.children[i].classList.contains("complete"), // 완료 상태
    };
    saveItems.push(todoObj); // 객체를 배열에 추가
  }

  // 배열이 비었으면 localStorage에서 데이터 제거, 아니면 저장
  saveItems.length === 0
    ? localStorage.removeItem("saved-items") // 데이터가 없으면 키 삭제
    : localStorage.setItem(
        "saved-items",
        JSON.stringify(saveItems) // 배열을 문자열로 변환 후 저장
      );
};

// 저장된 데이터가 있으면 불러와 화면에 표시
if (savedTodoList) {
  for (let i = 0; i < savedTodoList.length; i++) {
    createTodo(savedTodoList[i]); // 저장된 데이터로 할 일을 생성
  }
}

const weatherSearch = function (position) {
  console.log(position);
  fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${position.latitude}&lon=${position.longitude}&appid=9756434244216c3d2f9c08591b54bede`)
}

// 위치 정보를 처리하는 함수
const acessToGeo = function (position) {
  const positionObj = {
    latitude: position.coords.latitude, // 위도
    longitube: position.coords.longitude // 경도 (오타: longitube → longitude)
  };
  console.log(positionObj); // 위치 정보 출력
  console.log(position); // 전체 위치 데이터 출력
  weatherSearch(positionObj)
};

// Geolocation API로 사용자 위치 요청
const askForLocation = function () {
  navigator.geolocation.getCurrentPosition(
    acessToGeo, // 위치 정보를 가져오면 실행할 콜백
    (err) => {
      console.log(err); // 에러가 발생하면 에러 정보를 출력
    }
  );
};

// 위치 요청 실행
askForLocation();

답변 1

0

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

이 규성 님의 질문을 보니, 날씨 API에서 발생하는 오류가 무엇인지 궁금하신 것 같습니다. 코드를 보면서 자주 발생하는 몇 가지 문제를 설명드리겠습니다.

  1. 좌표 관련 변수 이름 오타:

    • 현재 코드의 acessToGeo 함수에서 longitube라는 오타가 발견됩니다. 이 부분은 longitude로 수정해야 합니다.
  2. API 호출 관련 문제:

    • API 호출 시, 잘못된 API 키 또는 활성화되지 않은 API 키를 사용하면 오류가 발생할 수 있습니다. API 키가 유효한지 확인해 보세요.
    • API 키가 활성화되지 않은 경우, OpenWeatherMap 계정에서 키가 활성 상태인지 확인하고, 만약 그렇지 않다면, 시간을 두고 다시 시도해보세요.
  3. 네트워크 요청 오류 확인:

    • 네트워크 콘솔에서 API 요청 및 응답을 확인하고(Network 탭), 오류가 있다면 구체적인 오류 메시지(예: 401 Unauthorized, 403 Forbidden)를 확인해 오류 원인을 파악할 수 있습니다.
  4. Geolocation API 사용 시 주의사항:

    • 브라우저 보안 설정 또는 권한 문제로 인해 Geolocation API 호출이 실패할 수 있습니다. 이때는 개발자 도구를 통해 에러 메시지를 확인하고 적절히 처리해야 합니다.

관련 답변을 참고하시려면 아래 링크를 확인해보세요:

  • GeolocationPositionError 오류 해결법 공유: 네트워크 오류와 관련된 해결 방법들을 공유하는 질문입니다. 이 곳의 조언을 바탕으로 학습 환경에서 나타나는 관련 문제를 해결할 수 있을 것입니다.

질문하신 부분 외에도 다른 어려움이 있으시다면, 이어서 질문해 주세요. 대학생, 취준생 모두 코딩에서 맞닥뜨리는 어려움을 함께 해결하고 싶습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이 규성님의 프로필 이미지
이 규성

작성한 질문수

질문하기