teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

解決の流れを修正

2020/10/12 09:56

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -17,34 +17,42 @@
17
17
  参照を試みただけでエラーで落ちてしまいます。
18
18
  それがこのエラー。
19
19
 
20
- `Cannot read property 'forEach' of undefined`を翻訳すると、
21
- `undefined`の`forEach`プロパティを参照しようとしたのでエラー。
22
-
23
- 転じて`tweets.forEach`の`tweets`は配列であるべきだったのに、
24
- `undefined`が入っている事が諸悪の根源です。
25
- なぜ`tweets`が配列でないのか?に着目してより上流の箇所を修正しましょう。
26
-
27
20
  ---
28
21
 
29
22
  さて、今回の質問を深堀りしましょう。
30
23
 
31
- ```js
32
- //イイねボタンの更新
33
- app.post('/update_good', (req, res) => {
34
- connection.query(
24
+ 今回のエラー文を読み解きましょうか。
35
- 'UPDATE tweets SET good WHERE id=?',
36
- [req.body.tweet_id],
37
- (error,results)=>{
38
- res.render('main.ejs',{user:username,tweets:results});
25
+ `Cannot read property 'forEach' of undefined`でしたっけ。
39
- });
40
- });
41
- ```
26
+ なので直訳すれば`undefined``forEach`プロパティを参照しようとしたのでエラー。
42
27
 
28
+ `forEach`があるのは`tweets.forEach`の行ですね。
29
+ `tweets`は配列であるべきだったのに`undefined`が入っている事が問題です。
30
+ なぜ`tweets`が配列でないのか?に着目し、より上流の箇所を修正しましょう。
31
+
32
+ そういや「いいねボタン」押した時の挙動がおかしいんでしたっけ?
33
+ どれどれ?
34
+
35
+ > ```js
36
+ > //イイねボタンの更新
37
+ > app.post('/update_good', (req, res) => {
38
+ > connection.query(
39
+ > 'UPDATE tweets SET good WHERE id=?',
40
+ > [req.body.tweet_id],
41
+ > (error,results)=>{
42
+ > res.render('main.ejs',{user:username,tweets:results});
43
+ > });
44
+ > });
45
+ > ```
46
+
43
47
  `'UPDATE tweets SET good WHERE id=?'`のSQL文を送った結果がどうなるのか確認してみましたか?
44
- というわけで、99.999%の確率でそが原因で、望んだ結果がresultに入っていと思います。
48
+ れは`UPDATE`の結果テーブルどうったかの結果が得られるはずです。
49
+ tweetsテーブルの値の配列が入っているはずがないんですよ。
45
50
 
46
- アップデートに成功したら
51
+ `UPDATE`に成功したら改めてSQLの`SELECT`を発行し
47
- 改めてSQLのSELECT文を送信し、その結果を`results`にして使いましょう。
52
+ `SELECT`の結果を`tweets`に束縛して使いましょう。
48
53
 
54
+ まぁこういったWebサーバを実装する上で、
49
- つかPostの結果でHTMLを返す作りにするとF5キーでリロードする度にPostの処理が走るので
55
+ Postの結果でHTMLを返す作りにするとF5キーでリロードする度にPostの処理が走るので微妙です。
56
+ リダイレクトさせるのが常套手段ですね。
57
+
50
- [Expressのリダイレクト機能](https://expressjs.com/ja/api.html#res.redirect)を使って`/`パスのgetにリクエストを受け流した方が良いで
58
+ [Expressのリダイレクト機能](https://expressjs.com/ja/api.html#res.redirect)を使って`/`パスのgetにリクエストを受け流す実装に変更しましょう