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

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

파이리님의 프로필 이미지
파이리

작성한 질문수

비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지

PM2를 활용한 무중단 배포

전체 핀이 조회되지 않습니다.

해결된 질문

작성

·

151

0

15개 장소db가 있는데 5개만 조회 됩니다.

코드가 잘못된 부분이 있을까요?

아무리 찾아도 잘 모르겠습니다;;

function getContent(data) {
	// 유튜브 섬네일 id 가져오기

	console.log(data);
	let replaceUrl = data.videoUrl;
	let finUrl = "";
	replaceUrl = replaceUrl.replace("https://youtu.be/", "");
	replaceUrl = replaceUrl.replace("https://youtube.com/embed", "");
	replaceUrl = replaceUrl.replace("https://youtube.com/watch?v=", "");
	finUrl = replaceUrl.split("&")[0];	

	// 인포윈도우 가공하기
	return ` 
	<div class="infowindow">
    <div class="infowindow-img-container">
      <img 
	  	src="https://img.youtube.com/vi/${finUrl}/mqdefault.jpg"
	  	class="infowindow-img"
	  />
    </div>
    <div class="infowindow-body">
      <h5 class="infowindow-title">${data.title}</h5>
      <p class="infowindow-address">${data.address}</p>
      <a href="${data.videoUrl}" class="infowindow-btn" target="_blank">영상이동</a>
    </div>
  </div>
  `;
}


// HTML 코드로 바꾸는 함수
function getContent(data) { 
	let videoId = "";
	let replaceUrl = data.videoUrl;
	replaceUrl = replaceUrl.replace("https://youtu.be/", "");
	replaceUrl = replaceUrl.replace("https://www.youtube.com/embed/", "");
	replaceUrl = replaceUrl.replace("https://www.youtube.com/watch?v=", "");
	videoId = replaceUrl.split("&")[0];
  
	const result = `<div class="infowindow">
	  <div class="infowindow-img-container">
		<img src="https://img.youtube.com/vi/${videoId}/mqdefault.jpg" class="infowindow-img" alt="...">
	  </div>
	  <div class="infowindow-body">
		<h5 class="infowindow-title">${data.title}</h5>
		<p class="infowindow-text">${data.address}</p>
		<a href="https://youtu.be/${videoId}" target="_blank" class="infowindow-btn">영상이동</a>
	  </div>
	</div>`;
	return result;
  }
  
	async function setMap(dataSet) {
		markerArray = [];
		infowindowArray = [];

	for (var i = 0; i < dataSet.length; i ++) {
	// 마커를 생성합니다 
	let coords = await getCoordsByAddress(dataSet[i].address)   
	var marker = new kakao.maps.Marker({
	 map: map, // 마커를 표시할 지도
	 position: coords, // 마커를 표시할 위치
	});

	markerArray.push(marker);

	// 마커에 표시할 인포윈도우를 생성합니다 
    var infowindow = new kakao.maps.InfoWindow({
     content: getContent(dataSet[i]), // 인포윈도우에 표시할 내용
    });

	infowindowArray.push(infowindow);

    // 마커에 mouseover 이벤트와 mouseout 이벤트를 등록합니다
    // 이벤트 리스너로는 클로저를 만들어 등록합니다 
    // for문에서 클로저를 만들어 주지 않으면 마지막 마커에만 이벤트가 등록됩니다
    kakao.maps.event.addListener(
		marker, 
		"click", 
		makeOverListener(map, marker, infowindow, coords));
    kakao.maps.event.addListener(
		map, 
		"click", 
		makeOutListener(infowindow));
	  }
   }

// 인포윈도우를 표시하는 클로저를 만드는 함수입니다W
// 1. 클릭시 다른 인포윈도우 닫기
// 2. 클릭한 곳으로 지도 중심 옮기기
function makeOverListener(map, marker, infowindow, coords) {
    return function() {
		// 1. 클릭시 다른 인포윈도우 닫기
		closeInfoWindow();
        infowindow.open(map, marker);
		// 2. 클릭한 곳으로 지도 중심 옮기기
		map.panTo(coords)	

    };
}

let infowindowArray = [];
function closeInfoWindow(){
	for (let infowindow of infowindowArray) {
		infowindow.close();
	}
}

// 인포윈도우를 닫는 클로저를 만드는 함수입니다 
function makeOutListener(infowindow) {
    return function() {
        infowindow.close();
    };
}

/*
**********************************************
5. 카테고리 분류
*/

// 카테고리
const categoryMap = {
	korea: "한식",
	china: "중식",
	japan: "일식",
	america: "양식",
	wheat: "분식",
	meat: "구이",
	sushi: "회/초밥",
	etc: "기타",
  };

  const categoryList = document.querySelector(".category-list");
  categoryList.addEventListener("click", categoryHandler);

  async function categoryHandler(event) {
	const categoryId = event.target.id;
	const category = categoryMap[categoryId];

	try {	
		// 데이터 분류
		let categorizedDataSet = await getDataSet(category);
	  
			
		// 기존 마커 삭제
		closeMarker();
	  
		// 기존 인포윈도우 닫기
		closeInfoWindow();
	  
		setMap(categorizedDataSet)
		} catch (error) {
		console.error(error);
		}
	   }
	  

let markerArray = [];
function closeMarker() {
	for (marker of markerArray) {
	marker.setMap(null)
   }
  } 

  async function setting() {
	try {
	  const dataSet = await getDataSet();
	  setMap(dataSet);
	} catch (error) {
	  console.error(error);
	}
  }
  
  setting();  

 

 

 

 

 

답변 1

0

Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

안녕하세요.

실제 몇개 영상이 비공개처리되서 유효하지 않은 링크라서 그런 것으로 추정됩니다.

원하시는 영상 데이터로 한번 테스트 해보시면 좋을 것 같습니다.

감사합니다.

파이리님의 프로필 이미지
파이리
질문자

안녕하세요.

카테고리 각각 클릭 시에는 핀 장소가 나타납니다.

전체 조회 시 일부만 보여 지는데 영상 데이터도 문제없이 다 잘나옵니다. db데이터 문제이기에 카테고리 선택시에는 잘 나타나서..;; 윈포윈도우 가공에서 object를 잘못 쓴건지 잘 모르겠습니다.

 

Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

그런 경우엔,, 전체 데이터 조회 쿼리쪽에 문제가 있는게 아닐까 추측되네요!

파이리님의 프로필 이미지
파이리

작성한 질문수

질문하기