前提・実現したいこと
現在地を取得して、最寄りのマクドナルドやガストなどを検索するアプリケーションを作成しています。
「Yahoo!ローカルサーチAPI」を利用して、その検索結果をJavaScriptから利用しようと思ったのですが、作成したWebアプリケーションを実行してコンソールを開くと、
Access to fetch at 'https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=(検索キーワード(URLエンコード済み))&dist=3&sort=geo&lon=(経度)&lat=(緯度)&output=json' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
というようなメッセージが表示されました。
恐らくCORS関連のエラーだとは思うのですが、解決方法が分かりません。
このエラーを解決し、JavaScriptから検索結果を利用できるようにしたいのですが、どうすればよろしいでしょうか?
発生している問題・エラーメッセージ
- 現在地を取得して、最寄りのマクドナルドやガストなどを検索するアプリケーションを開発中である。
「Yahoo!ローカルサーチAPI」を利用して、その検索結果をJavaScriptから利用しようと思ったのですが、作成したWebアプリケーションを実行してコンソールを開くと、
Access to fetch at 'https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=(検索キーワード(URLエンコード済み))&dist=3&sort=geo&lon=(経度)&lat=(緯度)&output=json' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
というようなメッセージが表示される。恐らくはCORS関連のエラーだとは思うが、解決方法が分からない。
- このエラーを解決し、JavaScriptから検索結果を利用できるようにしたい。
該当のソースコード
javascript
1const app = new Vue({ 2 el: "#app", 3 data:{ 4 lon: NaN, 5 lat: NaN, 6 target: "", 7 }, 8 methods:{ 9 getLocation: function(){ 10 //検索対象が入力されていない場合は検索をしない 11 if(this.target===""){ 12 return; 13 } 14 navigator.geolocation.getCurrentPosition(this.getLocationImpl); 15 }, 16 getLocationImpl: function(position){ 17 this.lon = position.coords.longitude; 18 this.lat = position.coords.latitude; 19 createMap(); 20 } 21 }, 22 23}); 24 25function GETYahooRequest(keyword, lon, lat){ 26 const RequestURL = "https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=" 27 +keyword+"&dist=3&sort=geo&lon="+String(lon)+"&lat="+String(lat)+"&output=json"; 28 fetch(RequestURL,{ 29 method: "GET", 30 mode: 'cors', 31 headers: { 32 "Access-Control-Allow-Origin": "", 33 "Access-Control-Allow-Methods": "GET", 34 "Access-Control-Allow-Headers": "*" 35 } 36 }) 37 .then((response) => { 38 if(response.ok){ 39 return response.json().then(resJson =>{ 40 console.log(JSON.stringify(resJson)); 41 }); 42 }else{ 43 throw new Error("リクエストが取得できませんでした。"); 44 } 45 46 }).then(resJson =>{ 47 return resJson; 48 }); 49} 50 51//地図を生成 52function createMap() { 53 //以下のコードは次のWebサイトを参考にしている:http://www.nowhere.co.jp/blog/archives/20180705-160052.html 54 const map = L.map('map'); 55 // タイルレイヤーを作成し、地図にセットする 56 L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { 57 maxZoom: 18, 58 attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html" target="_blank">国土地理院</a>', 59 }).addTo(map); 60 61 // 地図の中心座標とズームレベルを設定する 62 map.setView([app.lat, app.lon], 13); 63 //目的地用のアイコンを生成 64 const targetMarker = L.AwesomeMarkers.icon({ 65 markerColor: 'orange' 66 }); 67 //現在地にマーカーを付ける(そのままだと見づらいので) 68 const currentLocation = L.marker([app.lat, app.lon]).addTo(map); 69 currentLocation.bindPopup("現在地"); 70 71 const targetLon = NaN; 72 const targetLat = NaN; 73 //YahooAPIで条件に合う店舗を検索し、緯度経度を取得する 74 //検索対象をURLエンコードする 75 const KeyWord = encodeURIComponent(app.target); 76 const JsonResult = GETYahooRequest(KeyWord, app.lon, app.lat); 77 //TODO: ルートを表示する(無理ならしなくてOK) 78 //検索結果の場所にマーカーを立てる 79 const targetLocation = L.marker([targetLat, targetLon], {icon:targetMarker}).addTo(map); 80 targetLocation.bindPopup("最寄りの"+app.target); 81 82}
試したこと
以下のサイトを元に、CORSのことについて調べたのですが、解決方法は分かりませんでした。
- CORS とは? - JavaScript の基本 - JavaScript 入門(URL:https://javascript.keicode.com/newjs/what-is-cors.php)
補足情報(FW/ツールのバージョンなど)
使用したライブラリ・プラグイン
- vue.js:バージョン2.6.14
- leaflet:バージョン1.3.1
- Leaflet.awesome-markers plugin:バージョン2.0
- 開発に使用しているブラウザ:Chrome(バージョン:91.0.4472.114)
- 開発に使用しているエディタ:VS Code
回答1件
あなたの回答
tips
プレビュー