소스 상에는 문제가 없어 보입니다.
(소스 복사하여 제컴퓨터로 테스트하니 잘 됩니다)
맨 처음 localhost 들어갔을 때는... 지도가 제대로 떴나요?
(그리고 console.log로 찍은 결과 데이터가 있던데.. 이것도 제대로 나왔나요?)
새로고침할 때... index.js 터미널 창이 닫혔고... 그래서 index.html에서 해당 파일을 찾지 못한 에러가 뜬 거 같습니다.
문제는 "node index.js" 터미널 창이 닫힌 것인데...
어쩌면 data.go.kr의 일시적 문제일 수도 있습니다. (공공데이터포털이 간헐적으로 제역할을 하지 못할 수 있음)
혹은 nodejs 문제를 생각해 볼 수 있는데... 해당 컴퓨터로 디버깅 없이는 정확한 원인을 짚기는 힘드네요.
그리고 비쥬얼스튜디오코드 터미널에서 "node index.js"실행하셨을 텐데...
혹시 모르니 vscode 터미널 말고 명령프롬프트(cmd)창에서 "node index.js"실행하여.. 진행해 보세요.
[Node.Js로 네이버 약국 지도 만들기 #2 (express & axios 모듈, 비동기 문제 해결) 영상 에러 질문의 답글] ----------------------------------------------------------------
Node.Js로 네이버 약국 지도 만들기 #2 (express & axios 모듈, 비동기 문제 해결) 영상 기준 42분45초경 로컬호스트에 들어가 새로고침을 하면 비주얼스튜디오코드에 터미널이 갑자기 혼자 꺼집니다. f12를 눌러보면 처음엔 오류가 없지만 새로고침이 완료하는 순간 터미널에서 node index.js 가 꺼지면서 Failed to load resource: net::ERR_CONNECTION_REFUSED 는 왼쪽에 뜨고 오른쪽에는 /pharmach_list?Q0=%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C&Q1=%EA%B0%95%EB%82%A8%EA%B5%AC&QT=&QN=&ORD=&pageNO=1&numOfRows=1000&_=1669988702241:1라는것만 뜨네요. 혹시 이유를 아시는지 여쭈어 봅니다. 또한 터미널에서 종료됨과 동시에 C:\nodejs_pharmacy\index.js:38 res.json(response.data.response.body); ^ TypeError: Cannot read properties of undefined (reading 'body') at C:\nodejs_pharmacy\index.js:38:41 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) 라는 메시지가 뜹니다.
댓글에에도 저와 비슷한 분의 답변을 보고 고쳐보았는데도 똑같은 결과가 뜹니다 혹시 필요하실지 몰라 코드도 복사해서 보내겠습니다.
node.js가 앞부분이고 <html>로 시작하는 부분부터가 index.html 입니다.
let express = require("express");
let axios = require("axios");
let app = express();
let port = process.env.PORT || 80;
app.use(express.static("public_html"));
app.listen(port, function(){
console.log("HTML 서버 시작됨");
});
// https://apis.data.go.kr/B552657/ErmctInsttInfoInqireService/getParmacyListInfoInqire?serviceKey=yuuAIagVrMk4nnZy2%2Fy47WSlSR6qihjxhcjfgbeNq5%2BeNCpfO%2FvoIwRuplGaBHclEUKpYaAmKL6aoxBKPfZqSw%3D%3D&Q0=%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C&Q1=%EA%B0%95%EB%82%A8%EA%B5%AC&QT=1&QN=%EC%82%BC%EC%84%B1%EC%95%BD%EA%B5%AD&ORD=NAME&pageNo=1&numOfRows=10
app.get("/pharmach_list", (req, res) => {
let api = async() => {
let response = null;
try {
response = await axios.get("http://apis.data.go.kr/B552657/ErmctInsttInfoInqireService/getParmacyListInfoInqire", {
params: {
"serviceKey": "yuuAIagVrMk4nnZy2/y47WSlSR6qihjxhcjfgbeNq5+eNCpfO/voIwRuplGaBHclEUKpYaAmKL6aoxBKPfZqSw==",
"Q0": req.query.Q0,
"Q1": req.query.Q1,
"QT": req.query.QT,
"QN": req.query.QN,
"ORD": req.query.ORD,
"pageNo": req.query.pageNo,
"numOfRows": req.query.numOfRows
}
})
}
catch(e) {
console.log(e);
}
return response;
}
api().then((response) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.json(response.data.response.body);
});
});
<html>
<head>
<script type="text/javascript" src="https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=7s9en5sdqp&submodules=geocoder"></script>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
</head>
<body>
<div style="margin-top: 20px; margin-bottom: 10px; font-weight: bold;">
약국 지도
</div>
<div id ="map" style="width: 100%; height: 80%;">
</div>
</body>
<script>
$(document).ready(async function(){
let XY = await getLocation();
//alert("위도" + XY.lat);
//alert("경도" + XY.lng);
//지도를 삽입할 HTML 요소 또는 HTML 요소의 id를 지정합니다.
var mapDiv = document.getElementById('map'); // 'map'으로 선언해도 동일
//옵션 없이 지도 객체를 생성하면 서울 시청을 중심으로 하는 16 레벨의 지도가 생성됩니다.
var map = new naver.maps.Map(mapDiv);
$.ajax({
url: "/pharmach_list",
type: "GET",
cache: false,
dataType: "json",
data: {"Q0": "서울특별시", "Q1": "강남구", "QT": "", "QN": "", "ORD": "", "pageNO": "1", "numOfRows": "1000"},
success: function(data) {
console.log(data);
},
error: function(requset, status, error){
}
});
});
async function getLocation() {
let XY = new Object();
if(navigator.geolocation){
let promise = new Promise((resolve, rejected) => {
navigator.geolocation.getCurrentPosition((position) => {
resolve(position);
});
});
let position = await promise;
//position.coords.latitude 위도
//position.coords.longitude 경도
XY.lat = position.coords.latitude
XY.lng = position.coords.longitude
}
return XY;
}
</script>
</html>
----------------------------------------------------------------