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

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

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

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

API

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

Q&A

解決済

1回答

879閲覧

Next.js でbuildすると読み込めていたAPIの値が読み込めない

gasuketu

総合スコア10

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

API

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

0グッド

0クリップ

投稿2021/05/22 09:47

Next.js でTVMazeというサービスのAPIを使ってアプリケーションを作成中、buildをするとnpm run dev では発生しないエラーが発生。
<エラー内容>
Cannot read property time of undefined

Typescript

1//pages/program/[id].tsx 2 3const Program:React.FC = ({data}:any) => { 4 const router = useRouter(); 5 const {id} = router.query; 6 console.log(data); 7 const {photoUrl,displayModal,hideModal} = useModalDisplay(); 8 9 return( 10 <> 11 <ProgramDetailBody data={data} /> //このコンポーネントでエラー(コードは下) 12 <PageTitle>Photo Gallery</PageTitle> 13 <GallaryDisplay id={id} setModalHandler={displayModal}/> 14 { photoUrl && <PhotoModal url={photoUrl} cancelHandler={hideModal} />} 15 </> 16 ) 17} 18 19export default Program; 20 21 22export const getStaticProps:GetStaticProps = async (ctx:any) => { 23 const id = ctx.params.id; 24 const res = await fetch(`http://api.tvmaze.com/shows/${id}`); 25 const data = await res.json(); 26 return{ 27 props:{data}, 28 revalidate:12*60*60 29 } 30} 31 32export const getStaticPaths = async () => { 33 const d = new Date(); 34 const y = d.getFullYear(); 35 const m = String(d.getMonth() + 1).padStart(2,"0"); 36 const date = String(d.getDate()).padStart(2,"0"); 37 const res = await fetch(`http://api.tvmaze.com/schedule/web?date=${y}-${m}-${date}`); 38 let dat = await res.json(); 39 const data = dat.filter((datum:any,index:number) => { 40 return datum._embedded.show.image !== null && datum._embedded.show.schedule.time !== "" 41 }); 42 let paths:any = []; 43 data.forEach((datum:any) => { 44 paths.push({params:{id:String(datum.id)}}); 45 }); 46 47 return { 48 paths:paths, 49 fallback:"blocking" 50 } 51} 52

TypeScript

1import React from 'react'; 2import DetailImage from '../atoms/DetailImage'; 3import ProgramInfoWrapper from "../molecules/ProgramInfoWrapper"; 4 5 6const ProgramDetailBody:React.FC<any> = (props) => { 7 let data = props.data; 8 let src = props.data.image ? props.data.image.original : null 9 return( 10 <div className="w-95% m-topAuto lg:flex justify-between block relative min-h-70rem"> 11 <DetailImage src={src} alt={props.data.name} /> 12 <ProgramInfoWrapper 13 name={props.data.name} 14 runtime={props.data.runtime} 15 url={props.data.url} 16 officialSite={props.data.officialSite} 17 language={props.data.language} 18 summary={props.data.summary || "No Summary"} 19 time={props.data.schedule.time} //ここで エラー 20 days={props.data.schedule.days} /> //ここでもエラーが出る 21 </div> 22 ) 23} 24 25export default ProgramDetailBody; 26

API

1{id: 53020, url: "https://www.tvmaze.com/shows/53020/rupauls-drag-race-down-under", name: "RuPaul's Drag Race Down Under", type: "Reality", language: "English", …} 2averageRuntime: 53 3dvdCountry: null 4externals: {tvrage: null, thetvdb: 368747, imdb: "tt14192040"} 5genres: [] 6id: 53020 7image: {medium: "https://static.tvmaze.com/uploads/images/medium_portrait/305/763370.jpg", original: "https://static.tvmaze.com/uploads/images/original_untouched/305/763370.jpg"} 8language: "English" 9name: "RuPaul's Drag Race Down Under" 10network: null 11officialSite: "https://www.stan.com.au/watch/rupauls-drag-race-down-under" 12premiered: "2021-03-05" 13rating: {average: null} 14runtime: 53 15schedule: {time: "16:00", days: Array(1)} 16status: "Running" 17summary: "<p>Shantay, G'day! Time to tuck in your budgies Aussie queens, <b>RuPaul's Drag Race Down Under</b> is finally here! The fiercest Kiwi and Aussie queens will go head-to-head in the hopes of taking home the title of Down Under's first Drag Superstar.</p>" 18type: "Reality" 19updated: 1621115358 20url: "https://www.tvmaze.com/shows/53020/rupauls-drag-race-down-under" 21webChannel: {id: 64, name: "Stan", country: {…}} 22weight: 97 23_links: {self: {…}, previousepisode: {…}, nextepisode: {…}} 24__proto__: Object 25

<試したこと>
一度、エラーが出たtimeとdaysの部分をprops.dataではなく定数を渡して(time = "foo"などとしました)動作を確認したところ正常に動作しました、props.data.scheduleのprops以外はしっかりと読み込まれるのですが、なぜなのでしょうか?
協力頼みます.

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答になるか分かりませんが、上手くいくかもしれないものを提示しておきます。

前提

Client(Chrome ブラウザ)で、 http://api.tvmaze.com/shows/53020schedule を確認できました。
pathsは、以下の値でした。

typescript

1[ 2 { params: { id: '2055983' } }, 3 { params: { id: '2085298' } }, 4 { params: { id: '2085182' } }, 5 { params: { id: '2083741' } }, 6 { params: { id: '2039957' } }, 7 { params: { id: '2092326' } } 8]

結論

  1. サーバサイドの fetch() が問題かもしれないので、 node-fetch を使用してみるのはどうか?

  2. http://api.tvmaze.com/shows/2055983 をアクセスしたら、 404 であるため、http://api.tvmaze.com/schedule/web?date=${y}-${m}-${date} の条件を変更してみるのはどうか?

  3. デフォルト値を与えるやり方(props.data?.schedule?.days ?? new Date()) で、無理矢理エラーを回避するやり方

上手くいかなかったら、すみません m(_ _)m

投稿2021/05/23 08:02

kuro3

総合スコア27

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

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

gasuketu

2021/05/23 14:21

回答ありがとうございます。結論2.3はアプリケーションの都合上、今の時点では変更できない部分であったため、結論1を試しましたが同様のエラーが発生しました。なぜなのでしょう、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問