Vue로 로컬에서 keywordSearch 함수 호출하는데 CORS 오류가 발생합니다

initPlaces () {
  this.ps = new kakao.maps.services.Places()
  this.ps.setMap(this.map)
  let kw = '가산동'
  this.ps.keywordSearch(kw, this.placeSearchCB)
},
placeSearchCB (data, status, pagination) {
  console.log([data, status, pagination])
},

위와 같이 Vue.methods 에서 설정하고 호출했는데,
크로스도메인 이슈가 발생됩니다.


오류 내용

Access to XMLHttpRequest at ‘http://dapi.kakao.com/v2/local/search/keyword.json?query=가산동&page=1&size=15’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: Redirect is not allowed for a preflight request.


image

  1. 계정쪽의 허용아이피 문제인가 싶어서 127.0.0.1 을 할당해두었는데,
    로컬에서 서버화해서 테스트 하려면 어떻게 해야할까요?

  2. api key 문제일까 싶어서 admin api 로도 바꿔봤는데 동일하네요…

키는 js 앱 키를 사용해주세요.
포트번호가 있다면 포트번호를 포함해서 등록해주어야 합니다.
사이트 도메인에 127.0.0.1:8080으로 등록이 되어 있는지 확인 부탁드립니다.

1개의 좋아요

image

위 처럼 설정하였는데 ,

말씀하신것 처럼 :8080 을 추가하려고 하니

[유효하지 않은 IP/CIDR or IP/MASK or IP 입니다.]

라고 뜹니다.

사이트 도메인에서 추가해주세요.
내 어플리케이션 > 앱 > 플랫폼 > web 플랫폼 > 사이트 도메인에서 추가해주세요.

1개의 좋아요

image

추가가 되어있었습니다.

전에 다른것을 작업할때 등록했던거 같습니다.

혹시 localhost:8080 에서는 안되는건가요?? …

서버에 올려야 확인 할 수가 있는건가요?

아니요 로컬에서도 사용 가능합니다.
저희가 제공하고 있는 API는 CORS가 허용되어 있습니다.

도메인, 포트, 키가 올바른지 확인 부탁드리고,
다른 브라우저에서도 동일한 현상인지 확인 부탁드립니다.
그리고 스크립트 import 하는 코드도 같이 첨부해주세요.

1개의 좋아요

답변사항


도메인, 포트, 키가 올바른지 확인 부탁

위에 사진을 드린것과 같이 설정되어있으면 정상적으로 되리라 생각됩니다.

다른 브라우저에서도 동일한 현상인지 확인

크롬 : 오류 / IE11 : 정상조회 / Edge : 정상조회 / Firefox : 정상조회
왜 크롬에서만 안될까요;; :nauseated_face::rage::face_with_symbols_over_mouth:
그래서 제 브라우저 확장프로그램 관련 문제일까 싶어서 Document 쪽 확인해 봤는데
정상적으로 작동합니다…즉, 제 코드 또는 설정 쪽의 문제인것 같은데…

kakaoapi.vue


export default {
  name: 'kakaomap',
  props: {
    apikey: {
      type: String
    },
    level: {
      type: Number
    },
    center: {
      type: Object
    },
    libraries: {
      type: Array
    }
  },
  methods: {
    loadScript () {
      const script = document.createElement('script') /* global kakao */
      let kakaourl = 'http://dapi.kakao.com/v2/maps/sdk.js'
      let queryString = []
      queryString.push('appkey=' + this.apikey)
      queryString.push('autoload=' + this.autoload)
      if (this.libraries.length > 0) {
        queryString.push('libraries=' + this.libraries.join(','))
      }
      kakaourl += '?' + queryString.join('&')
      script.onload = () => kakao.maps.load(this.initMap)
      script.src = kakaourl
      document.head.appendChild(script)
    },
    // 맵 initialize
    initMap () {
      const options = {
        center: new kakao.maps.LatLng(this.center.lat, this.center.lng),
        level: this.level
      }
      this.map = new kakao.maps.Map(this.$el, options)

      this.initPlaces()
    },
    // 검색 initialize
    initPlaces () {
      let ps = new kakao.maps.services.Places()
      let kw = '가산동'
      ps.keywordSearch(kw, this.placeSearchCB)
    },
    placeSearchCB (data, status, pagination) {
      console.log([data, status, pagination])
    }
  },
  data () {
    return {
      map: null,
      autoload: false
    }
  },
  mounted () {
    window.kakao && window.kakao.maps ? this.initMap() : this.loadScript()
  }
}


Page1.vue

      <Kakaomapapi
        :apikey="apikey"
        :level.sync="level"
        :center.sync="mapCenter"
        :libraries="libraries"
        :keyword="keyword"
        @load="kakaomapOnload"
        @selectMarker="selectedMarker"
        style="width:100%;height:600px;" ></Kakaomapapi>
    

import Chicken from '@/data.json'
import Kakaomapapi from '@/components/Kakaoapi'
export default {
  name: 'Page1',
  components: {
    Kakaomapapi
  },
  methods: {
    kakaomapOnload: (callback) => {
      // 현재 위치 Center 조회,
      // 위치 근처의 데이터 조회
      // Center 에 대한 데이터로AJax 조회
      if (callback) {
        callback(Chicken.positions)
      }
    },
    // 마커선택시 글 목록 데이터 갱신
    selectedMarker: (marker, callback) => {
      // 해당 영역에 대한 데이터 Ajax로 조회
      let options = {

      }
      let p = new Promise(
        function (resolve, reject) {
          this.getArticleListJson(options)
        }
      )
      p.then(function (val) {
        if (callback) {
          callback(val)
        }
      })
      p.catch(() => {
        console.log('promise reject')
      })
    },
    getMarkerJson: (options) => {
      // Kakaomap Marker 데이터 조회
    },
    getArticleListJson: (options) => {
      // Article List 데이터 조회
    }
  },
  data () {
    console.log(process.env)
    return {
      msg: 'test',
      apikey: process.env.API_KEY,
      level: 3,
      libraries: [
        'services',
        'clusterer',
        'drawing'
      ],
      keyword: '',
      // mapCenter: {lat: 33.450701, lng: 126.570667}
      mapCenter: {lat: 37.48924942751741, lng: 126.85372827541924}
    }
  }
}

Page1.vue 에서 kakaoapi.vue 파일을 호출하도록 되어있습니다.

음… 첨부 소스를 제 로컬에서 실행하면 크롬으로도 정상 동작이 되네요.
크롬 버전은 87.0.4280.88 으로 최신 버전입니다.
크롬 버전과 시크릿 모드에서도 동일한지도 확인 부탁드립니다.

1개의 좋아요

음… 시크릿 모드는 잘되네요;; 이런 데체 무슨원인일지 감도 안오네요 ;;;
혹시나 구글 계정? 일까 싶어서 다른계정으로 해봤는데… 되요;; 잘 되요;;

확장 프로그램간의 문제가 있는지 싶네요…
우선 답변해주실수 있는 범위가 벗어난것같네요.
제가 테스트 해보고 결과는 남겨두도록 하겠습니다. 감사했습니다.

1개의 좋아요

ad blocker 같은 광고 차단 플러그인이 브라우저에 깔려있는지 확인 부탁드립니다.
해당 플러그인이 있으면 스크립트를 block 할 수 있기 때문에 끄고 사용해주세요.

1개의 좋아요

동일하게 환경을 맞추려고 동작하던 다른계정에 확장프로그램 설치해본 결과 정상적으로 작동되고,
기존에 안되던 계정에 인터넷 사용기록을 제거 했더니 다시 되네요.

어떤 내역에서 문제가 발생되었던건지는 확인이 안되나…
사용기록 삭제로 인해 해결되었습니다…

(결국 캐싱으로 발생된 문제…인데 왜 CORS 가… 문제가 된걸까요… 이해가 안되네요… )
감사합니다.

1개의 좋아요