質問: list[tweet.category]; %> #<%= category %> <% }); %> ``` ### 該当のソースコード ``` //mainページの表示 app.get('/main', (req, res) => { connection.query( 'SELECT * FROM tweets', (error,results)=>{ res.render('main.ejs',{user:username,tweets:results}); }); }); //イイねボタンの更新 app.post('/update_good', (req, res) => { connection.query( 'UPDATE tweets SET good WHERE id=?', [req.body.tweet_id], (error,results)=>{ res.render('main.ejs',{user:username,tweets:results}); }); }); ``` ### 試したこと 送信ボタンを押すと、このようなエラーを吐き出します。 表示をするだけなら、問題なくできております。 ### 補足情報(FW/ツールのバージョンなど) "dependencies": { "ejs": "^3.1.5", "express": "^4.17.1", "jquery": "^3.5.1", "mysql": "^2.18.1" }
回答: > > `Cannot read property 'forEach' of undefined` > > > このエラー文は頻出なので覚えましょう。 まずはエラー文が何者なのかを説明します。 JSはオブジェクト指向プログラミング言語なので、 値はオブジェクトです。 オブジェクトはプロパティを所持することが許されています。 しかし、JSではプロパティの所持を許されていない 例外中の例外の値が2つ存在します * null * undefined これらはプロパティの所持を許されていないどころか、 参照を試みただけでエラーで落ちてしまいます。 それがこのエラー。 さて、今回の質問を深堀りしましょう。 今回のエラー文を読み解きましょうか。 `Cannot read property 'forEach' of undefined`でしたっけ。 なので直訳すれば`undefined`の`forEach`プロパティを参照しようとしたのでエラー。 `forEach`があるのは`tweets.forEach`の行ですね。 `tweets`は配列であるべきだったのに`undefined`が入っている事が問題です。 なぜ`tweets`が配列でないのか?に着目し、より上流の箇所を修正しましょう。 そういや「いいねボタン」押した時の挙動がおかしいんでしたっけ? どれどれ? > > > ``` > //イイねボタンの更新 > app.post('/update_good', (req, res) => { > connection.query( > 'UPDATE tweets SET good WHERE id=?', > [req.body.tweet_id], > (error,results)=>{ > res.render('main.ejs',{user:username,tweets:results}); > }); > }); > ``` > > `'UPDATE tweets SET good WHERE id=?'`のSQL文を送った結果がどうなるのか確認してみましたか? これは`UPDATE`の結果テーブルがどうなったかの結果が得られるはずです。 tweetsテーブルの値の配列が入っているはずがないんですよ。 `UPDATE`に成功したら改めてSQLの`SELECT`を発行し `SELECT`の結果を`tweets`に束縛して使いましょう。 まぁこういったWebサーバを実装する上で、 Postの結果でHTMLを返す作りにするとF5キーでリロードする度にPostの処理が走るので微妙です。 リダイレクトさせるのが常套手段ですね。 Expressのリダイレクト機能を使って`/`パスのgetにリクエストを受け流す実装に変更しましょう。