質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

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

React.js

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

Q&A

1回答

757閲覧

Reactで、twitterのtweet一覧を表示できない

masaking

総合スコア30

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

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

React.js

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

0グッド

0クリップ

投稿2020/03/31 14:34

いつも皆さんに助けていただいてます。ありがとうございます。

expressで作ったapiサーバーにて、取得した自分のツイートのtextを、reactで表示できずに悩んでいます。

参考動画を見ながら頑張っていますが、http-hook.jsが何をしているのかさっぱりで、loadedtweetsに、textが入っているらしいのですが、うまく取り出して表示することができません。

見様見真似で生半可な理解で進んでいるつけが回ってきている気がします。

何が原因でtextが表示されず、どのようにすれば解決できるのでしょうか。

tweetXXX.js

js

1import React, {useEffect, useState} from 'react'; 2import { useHttpClient } from '../../shared/hooks/http-hook'; 3 4const Tweets = () => { 5 const [loadedtweets, setLoadedtweets] = useState(); 6 const { isLoading, error, sendRequest, clearError } = useHttpClient(); 7 8 9 useEffect(()=>{ 10 const fetchTweets = async () => { 11 const responseData = await sendRequest( 12 `http://localhost:5000/twitter/mytweet` 13 ); 14 setLoadedtweets(responseData.tweets); 15 }; 16 fetchTweets(); 17 }, [sendRequest]); 18 19 20 return( 21 <div> 22 {loadedtweets.map(({text})=>({text}))} 23 </div> 24 ); 25}; 26 27export default Tweets;

http-hook.js

js

1import { useState, useCallback, useRef, useEffect } from 'react'; 2 3export const useHttpClient = () => { 4 const [isLoading, setIsLoading] = useState(false); 5 const [error, setError] = useState(); 6 7 const activeHttpRequests = useRef([]); 8 9 const sendRequest = useCallback( 10 async (url, method = 'GET', body = null, headers = {}) => { 11 setIsLoading(true); 12 const httpAbortCtrl = new AbortController(); 13 activeHttpRequests.current.push(httpAbortCtrl); 14 15 try { 16 const response = await fetch(url, { 17 method, 18 body, 19 headers, 20 signal: httpAbortCtrl.signal 21 }); 22 23 const responseData = await response.json(); 24 25 activeHttpRequests.current = activeHttpRequests.current.filter( 26 reqCtrl => reqCtrl !== httpAbortCtrl 27 ); 28 29 if (!response.ok) { 30 throw new Error(responseData.message); 31 } 32 33 setIsLoading(false); 34 return responseData; 35 } catch (err) { 36 setError(err.message); 37 setIsLoading(false); 38 throw err; 39 } 40 }, 41 [] 42 ); 43 44 const clearError = () => { 45 setError(null); 46 }; 47 48 useEffect(() => { 49 return () => { 50 // eslint-disable-next-line react-hooks/exhaustive-deps 51 activeHttpRequests.current.forEach(abortCtrl => abortCtrl.abort()); 52 }; 53 }, []); 54 55 return { isLoading, error, sendRequest, clearError }; 56}; 57

なお、http://localhost:5000/twitter/mytweetにアクセス(バックエンド)して得られるjsonは、以下の形式です。
ここまでは動作しているので、react側の問題だと考えています。

json

1[ 2 { 3 "text": "試しにXXXスニーカー履いたらベストサイズだった。ワンちゃんしかない。" 4 }, 5 { 6 "text": "今年も無事入院コースでした最近毎年XXX" 7 }, 8 (中略) 9]

以上になります。
足りない情報ありましたらご連絡ください。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

tweetXXX.js を 2 箇所直したら動くと思います。

まず、TypeError: undefined is not an object (evaluating 'loadedtweets.map') というエラーが出てると思いますが、これは最初(ツイートを読み込む前)は loadedtweets には何も入ってない (undefined) からで、とりあえず return のところで次のようにチェックしてあげれば良いでしょう。

diff

1 return( 2 <div> 3- {loadedtweets.map(({text})=>({text}))} 4+ {loadedtweets && loadedtweets.map(({text})=>({text}))} 5 </div> 6 );

これでエラーはなくなっても表示は空のままだと思いますが、返ってくるデータが配列で tweets なんてキーはないからで、とりあえず useEffect を以下のようにすれば動くでしょう。(もっとも、これは API サーバー側が間違ってる気がしなくもないですが。)

diff

1 useEffect(()=>{ 2 const fetchTweets = async () => { 3 const responseData = await sendRequest( 4 `http://localhost:5000/twitter/mytweet` 5 ); 6- setLoadedtweets(responseData.tweets); 7+ setLoadedtweets(responseData); 8 }; 9 fetchTweets(); 10 }, [sendRequest]);

ところで、「http-hook.jsが何をしているのかさっぱり」とのことですが、async/await を使った custom hook ですから初心者には相当難しいと思います。もっと簡単な教材を探した方がいいかもしれませんね。

投稿2020/03/31 22:11

hoshi-takanori

総合スコア7901

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

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

masaking

2020/04/01 12:07 編集

アドバイスありがとうございます。 結論から言うと、おっしゃる通りに直してみたところ、ダメでした。 TypeError: Cannot read property 'map' of undefined とエラーが出ています。 問題の切り分けのために、一度、データの配列をtweetXXX.jsにてもち、そこから出力する形に変更したところ、出力できたので、postmanでgetできるところも含めると、うまくバックエンドから情報を引き出せていないようです。どうしたものか... 並行して、簡単な教材を探してやってみようと思います。 https://www.yoheim.net/blog.php?q=20170107などでみた、fetch を使ったやり方にトライしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問