初めて投稿させて頂きます。
現在、React.jsとTypescriptを自分で学習中で、何か作ってみたいと思い、APIを扱ってNetflixのクローンを作ろうとしています。(このURLを参考にしております)
その中で、外部APIを扱ってデータを取得する際のエラーがどうしても解決できず、周りに聞ける人もいない為、アドバイス頂きたく投稿させて頂いたのが背景です。
【解決したい事】
localhostにてTypeScriptで外部APIを扱い、非同期通信でデータを取得する際、エラーが出て取得できずにいる為、このエラーを解決したい。
具体的には、TMDB(Movie Database)のAPIで映画のデータを取得しようとしています。
【実行した事】
基本的に上記URLの通りに進めました。
create-react-appで環境構築し、下記実装。
まずは、axios.jsの作成(axiosインストール済)
axios.js
1import axios from 'axios'; 2 3//TMDBからのbaseURLリクエストを作成 4const instance = axios.create({ 5 baseURL:"https://api.themoviedb.org/3", 6}); 7export default instance;
次にrequest.jsの作成(上記baseURLの末尾につけて判断させるもの)
request.js
1const API_KEY = "hogehoge"; 2 3export const requests = { 4 fetchTrending:`/trending/all/week?api_key=${API_KEY}&language=en-US`, 5 fetchNetflixOriginals:`/discover/tv?api_key=${API_KEY}&with_networks=213`, 6 fetchTopRated:`/movie/top_rated?api_key=${API_KEY}&languager=en-US`, 7 fetchActionMovies:`/discover/tv?api_key=${API_KEY}&with_genres=28`, 8 fetchComedyMovies:`/discover/tv?api_key=${API_KEY}&with_genres=35`, 9 fetchHorrorMovies:`/discover/tv?api_key=${API_KEY}&with_genres=27`, 10 fetchRomanceMovies:`/discover/tv?api_key=${API_KEY}&with_genres=10749`, 11 fetchDocumentMovies:`/discover/tv?api_key=${API_KEY}&with_genres=99`, 12};
次に映画を一列で表示するコンポーネントを作成。
Row.tsx
1import { useState, useEffect } from "react"; 2import axios from 'axios'; 3 4type Props = { 5 title: string; 6 fetchUrl: string; 7 isLargeRow: boolean; 8}; 9 10type Movie = { 11 id: string; 12 name: string; 13 title: string; 14 original_name: string; 15 poster_path: string; 16 backdrop_path: string; 17}; 18 19export const Row = ({ title, fetchUrl }: Props) => { 20 const [movies, setMovies] = useState<Movie[]>([]); 21 22 useEffect(() => { 23 async function fetchData() { 24 const request = await axios.get(fetchUrl); 25 setMovies(request.data.results); 26 return request; 27 } 28 fetchData(); 29 }, [fetchUrl]); 30 31 console.log('movies', movies); 32 33 return( 34 <div className="Row" /> 35 ); 36};
最後に、Rowコンポーネントを設置。
App.tsx
1import { Row } from './Row'; 2import { requests } from './request'; 3import './App.css'; 4 5function App() { 6 return ( 7 <div className="App"> 8 <Row 9 title="NETFLIX ORIGINALS" 10 fetchUrl={requests.fetchNetflixOriginals} 11 isLargeRow 12 /> 13 <Row title="Top Rated" fetchUrl={requests.fetchTopRated} isLargeRow /> 14 <Row title="Action Movies" fetchUrl={requests.fetchActionMovies} isLargeRow /> 15 <Row title="Comedy Movies" fetchUrl={requests.fetchComedyMovies} isLargeRow /> 16 <Row title="Horror Movies" fetchUrl={requests.fetchHorrorMovies} isLargeRow /> 17 <Row title="Romance Movies" fetchUrl={requests.fetchRomanceMovies} isLargeRow /> 18 <Row title="DOcumentaries" fetchUrl={requests.fetchDocumentMovies} isLargeRow /> 19</div> 20 ); 21}
【何が起こったか、エラーメッセージ】
この状態で、console.log('movies', movies);
に対して、データを取得できているか確認したところ、下のエラーがでました。
また、上のスクショの通り、moviesは何のデータも取得していないようです。
【試した事】
①Postmanを使って試しに叩いてみたところ、データは問題なく取得できました。(API自体は問題ない?)
(https://api.themoviedb.org/3/discover/tv?api_key=hogehoge&language=en-US)
②元動画も確認しながら進めてみたのですが、同じエラーが出てデータを取得できませんでした。
③エラー文から検索して解決を試みたのですが、解決できずにいます。
ーーーーーーーーーーーーーーーーーーーーー
このエラーで何日も解決できず、完全に行き詰まってしまった為、
アドバイス頂きたくお願い致します。
宜しくお願い致します。

回答1件
あなたの回答
tips
プレビュー