質問するログイン新規登録
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

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

React.js

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

Q&A

解決済

1回答

1401閲覧

TypeScriptで外部APIを扱い、非同期通信でデータを取得する際、code404エラーが出てしまう。

kouhsh04

総合スコア1

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

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

React.js

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

0グッド

0クリップ

投稿2022/02/19 14:33

0

0

初めて投稿させて頂きます。

現在、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)
イメージ説明
元動画も確認しながら進めてみたのですが、同じエラーが出てデータを取得できませんでした。
③エラー文から検索して解決を試みたのですが、解決できずにいます。

ーーーーーーーーーーーーーーーーーーーーー

このエラーで何日も解決できず、完全に行き詰まってしまった為、
アドバイス頂きたくお願い致します。
宜しくお願い致します。

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

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

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

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

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

hoshi-takanori

2022/02/19 14:38

スクショを見ると、API リクエストは TMDB ではなく localhost に送られてるようですが…。
guest

回答1

0

ベストアンサー

Row.tsxにミスが有ります。
axios.jsにて、axiosのリクエスト先(baseURL)を外部のAPIサービスに向けているのですが、そのインスタンスを使用していないので、baseURLがlocalhostになり、レスポンスが帰ってきていない状態です。

そのため、axiosをbaseURLを設定したものを使用するように変えてやればいけます

import axios from 'axios'; ↓ import axios from '../axios'; // パスの指定はディレクトリ構成似合わせて変えてください

また、参考のzennを拝見したところ、githubのリンクが記載されておりその中をみると詰まった際に参考になるかと思います。

投稿2022/02/19 16:55

natsume2233

総合スコア225

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

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

kouhsh04

2022/02/21 12:39

natsume2233様 返信が遅れて大変失礼致しました。 また、ご指摘ありがとうございます!!!! axiosのパスを修正したら機能しました! axios自体も初めて学んでいるので、正確に理解できておりませんでした。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問