🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

1932閲覧

React+ReduxでLaravel APIを叩いたときのレスポンスの表示でエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2019/10/21 18:48

編集2019/10/22 15:56

前提・実現したいこと

現在、Reactでパラメータと一緒にLaravel APIを叩き、Laravel側は更にそのパラメータをつかって外部(ホットペッパーグルメ)のAPIを叩き、その結果をReact側に返す機能を実装中です。一度Laravelを噛ませる理由はCORS回避の為です。
パラメータに関してはリクエストを送る前のページで確定されています。
試しに、Postmanでリクエストを送ったところ下記のようにレスポンスは返ってきます。
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.*

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは

修正後のコードの下記の部分

イメージ説明

の中で

修正前:

javascript

1console.log(JSON.parse(respose.data).results)

としている行ですが、respose.data はJSON文字列ではなく、すでにparseされたオブジェクトになっているので、下記に修正でいかがでしょうか?

修正後:

javascript

1console.log(respose.data.results)

以下は axios - Response Schema からの引用です。

// data is the response that was provided by the server

data: {},

以上、参考になれば幸いです。

投稿2019/10/22 17:10

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 17:30

ご回答ありがとうございます!! 無事表示されました!! ありがとうございました!!
jun68ykt

2019/10/22 17:33

どういたしまして。 > 無事表示されました!! とのことで、よかったです????
guest

0

普段axiosは使わないので明るくないのですが、axios.getは非同期通信をするのではないでしょうか?
axios.get(url).then(res => { console.log(res.data.result); }); で確認してください。

投稿2019/10/21 23:18

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 15:58

ご回答ありがとうございます! それも考慮して実装してみましたが、エラーが発生しましたね…。 試したことにも追記致しました! 是非ご一読お願いいたします。
thyda.eiqau

2019/10/22 16:16

エラーメッセージが変わっていますね。 axiosの通信自体は成功しているように見えますが(それ以外のところでコードの書き方に疑問は残りますが)、axiosの結果として返ってきているデータが正しくJSONのフォーマットに則っているかを確認してください。
退会済みユーザー

退会済みユーザー

2019/10/22 17:32

どうやら、axiosはオブジェクトとしてレスポンスを返してくれる様です…。 無事表示されました! お騒がせいたしました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問