前提・実現したいこと
現在、Reactでパラメータと一緒にLaravel APIを叩き、Laravel側は更にそのパラメータをつかって外部(ホットペッパーグルメ)のAPIを叩き、その結果をReact側に返す機能を実装中です。一度Laravelを噛ませる理由はCORS回避の為です。
パラメータに関してはリクエストを送る前のページで確定されています。
試しに、Postmanでリクエストを送ったところ下記のようにレスポンスは返ってきます。
しかし、下記のようにレスポンスをJSON.parse()を使ってオブジェクトに変換し、console.log()してみても
…の様にエラーが表示されます。
Postmanで送ったところ正しいレスポンスが返ってきていることから、恐らく、リクエストが意図した通りに送られていないのでレスポンスも正しく返ってきていない、もしくは私のJSON.parse()に対する理解が及んでいないかのどれかだと思い、コードを書き直してはいますが一向に解決致しません。
どなたか解決方法のご教授お願い致します。
発生している問題・エラーメッセージ
Uncaught TypeError: Cannot read property 'results' of undefined at app.js:120993
該当のソースコード
JavaScript
1/*** リクエストファイル ***/ 2 3class Result extends React.Component { 4 constructor(props) { 5 super(props) 6 this.state = { 7 lat: '', 8 lng: '' 9 } 10 } 11 12 componentDidMount() { 13 // Get user current position 14 navigator.geolocation.getCurrentPosition((position) => { 15 this.setState({ 16 lat: position.coords.latitude, 17 lng: position.coords.longitude 18 }) 19 const lat = position.coords.latitude 20 const lng = position.coords.longitude 21 console.log(position.coords) 22 23 const httpURL = 'http://localhost:8000/api/gourmet?range=3&order=4' 24 this.props.actions.httpRequest() 25 const res = axios.get(`${httpURL}&lat=${lat}&lng=${lng}&party_capacity=${this.props.QuestionsReducer.people}&budget=${this.props.QuestionsReducer.budget}&free_food=${this.props.AmountReducer.freeFood}&free_drink=${this.props.AmountReducer.freeDrink}&genre=${this.props.QuestionsReducer.genre}`) 26 this.props.actions.httpSuccess() 27 console.log(JSON.parse(res.data.results)) 28 }, (err) => { 29 this.props.actions.httpFailure() 30 console.log(err) 31 }) 32 } 33 34 render() { 35 const { classes } = this.props 36 return ( 37 <div className={classes.root}> 38 <div className={classes.toolbar} /> 39 <h1>周辺のお店</h1> 40 {/* TODO: Modify Google Maps layout */} 41 <Map 42 style={mapStyle} 43 google={this.props.google} 44 zoom={14} 45 center={{ lat: this.state.lat, lng: this.state.lng }} 46 initialCenter={{ lat: this.state.lat, lng: this.state.lng }} 47 > 48 <Marker 49 title={'現在地'} 50 position={{ lat: this.state.lat, lng: this.state.lng }} 51 /> 52 </Map> 53 <h1>aaaaaaaaaa</h1> 54 </div> 55 ) 56 } 57} 58const mapStateToProps = state => ({ 59 QuestionsReducer: state.QuestionsReducer, 60 AmountReducer: state.AmountReducer, 61 HttpReducer: state.HttpReducer 62}) 63 64const mapDispatchToProps = dispatch => ({ 65 actions: bindActionCreators(actions, dispatch) 66}) 67 68const styledResult = withStyles(styles, { withTheme: true })(Result) 69const wrappedStyledResult = GoogleApiWrapper({ apiKey: ('AIzaSyDXmfufz94HbjCTfGwUBF4TCIwJ2_j-KW8') })(styledResult) 70 71export default connect(mapStateToProps, mapDispatchToProps)(wrappedStyledResult)
PHP
1/*** api.php ***/ 2 3Route::get('/gourmet', 'GetGourmetController@gourmet')->name('api.jwt.gourmet');
PHP
1/*** GetGourmetController.php ***/ 2 3<?php 4 5namespace App\Http\Controllers; 6 7use Illuminate\Http\Request; 8use GuzzleHttp\Client; 9 10class GetGourmetController extends Controller 11{ 12 public function gourmet(Request $req) 13 { 14 $lat = $req->lat; 15 $lng = $req->lng; 16 $partyCapacity = $req->party_capacity; 17 $budget = $req->budget; 18 $freeFood = $req->free_food; 19 $freeDrink = $req->free_drink; 20 $genre = $req->genre; 21 $param = "?key=*****&format=json&range=3&order=4&lat=$lat&lng=$lng&party_capacity=$partyCapacity&budget=$budget&free_food=$freeFood&free_drink=$freeDrink&genre=$genre"; 22 23 $client = new Client([ 24 // Base URI is used with relative requests 25 'base_uri' => 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1', 26 // You can set any number of default request options. 27 'timeout' => 2.0, 28 ]); 29 $res = $client->request('GET', $param)->getBody(); 30 31 return $res; 32 } 33}
試したこと
QuestionsReducer、AmountReducer内のstateはconsole.log()で確認したところ、しっかり格納されていました。
lat,lngも同様です。
【追記】
このように変更してみましたが、 「SyntaxError: Unexpected token G in JSON at position 0」 と表示されてしまいます。
console.log(url)でリクエストURLも確認してみましたが、異常はなしでした…。
補足情報(FW/ツールのバージョンなど)
Laravel 5.8.*
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/22 17:30
2019/10/22 17:33