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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Next.js

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

React.js

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

Q&A

解決済

3回答

1801閲覧

Next.jsでfirestoreのデータからgetStaticPathsが作られない

Shmupeiii

総合スコア105

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Next.js

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

React.js

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

1グッド

0クリップ

投稿2022/12/31 03:16

編集2022/12/31 14:52

前提

現在下記の動画を参考にして、
firestoreのデータからダイナミックルーティングのページを生成しようとしています。
下記の動画の構造を真似して、firestore版に変えています。

参考動画
https://www.youtube.com/watch?v=mAHqpdVzJmA

実現したいこと

https://firestore.googleapis.com/v1/projects/next-auth-app-2aa40/databases/(default)/documents/posts
のfirestoreのデータからidを取得して、ダイナミックルーティングのページを生成(posts/[id].tsx)をしたい

発生している問題・エラーメッセージ

ですが、現状だとyarn build時にエラーが出てしまいます。

> Build error occurred TypeError: data.map is not a function at getStaticPaths (/Users/abeshmupeii/manga-kousatu.net/.next/server/pages/posts/[id].js:23:24) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async buildStaticPaths (/Users/abeshmupeii/manga-kousatu.net/node_modules/next/dist/build/utils.js:491:31) at async /Users/abeshmupeii/manga-kousatu.net/node_modules/next/dist/build/utils.js:632:119 at async Span.traceAsyncFn (/Users/abeshmupeii/manga-kousatu.net/node_modules/next/dist/trace/trace.js:79:20) { type: 'TypeError' }
const paths = data.map((post) => { return { params: { id: post.id.toString() }, }; });

にidがうまく入らないのが原因だと考えています。
全体のデータ自体は取得できる状態です。
対処法があれば教えて頂きたいです。

よろしくお願いします。

javaScript

JavaScript

1export const getStaticPaths = async () => { 2 const res = await fetch( 3 "https://firestore.googleapis.com/v1/projects/next-auth-app-2aa40/databases/(default)/documents/posts" 4 ); 5 const data = await res.json(); 6 7 const paths = data.map((post) => { 8 return { 9 params: { id: post.id.toString() }, 10 }; 11 }); 12 13 return { 14 paths, 15 fallback: false, 16 }; 17}; 18 19export const getStaticProps = async (context) => { 20 const id = context.params.id; 21 const res = await fetch( 22 "https://firestore.googleapis.com/v1/projects/next-auth-app-2aa40/databases/(default)/documents/posts" + 23 id 24 ); 25 const data = await res.json(); 26 27 return { 28 props: { 29 post: data, 30 }, 31 }; 32}; 33 34const Daitails = ({ post }) => { 35 return ( 36 <div> 37 <h1>{post.title}</h1> 38 </div> 39 ); 40}; 41 42export default Daitails; 43 44

試したこと

12月31日

イメージ説明

イメージ説明

補足情報(FW/ツールのバージョンなど)

ソースコード

https://github.com/takoyan33/manga-kousatu.net

uky👍を押しています

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

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

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

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

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

uky

2022/12/31 07:58

これデータの型って配列になっていますでしょうか? > TypeError: data.map is not a function とあるので、一見するとdataの型が配列ではなくstringになっているような気がします。
uky

2022/12/31 07:59

mapメソッドは配列の時に使用できる関数ですので、dataが配列でなければこのようなエラーが出ることになります
Shmupeiii

2022/12/31 11:48

回答ありがとうございます。 今確認したら確かにそうなっていました。 var array = Object.keys(data).map(function (key) { return data[key]; }); を追加して、arrayを見たのですが、 2) [{…}, {…}] 0 : createTime : "2022-12-29T10:49:01.941103Z" fields : categori : {stringValue: 'ONE PIECE'} context : {stringValue: 'なぜ黒ひげがコビーをさらったか軽く予想する\n\n経緯は、王下七武海制度の撤廃によりハンコックの拿捕のた…とから、何か提示して、それを飲み込んでいった可能性がある\n\nいずれにしてもすごく気になる展開である'} contextimage : {stringValue: ''} createtime : {stringValue: '2022/12/29 19:49:01'} displayname : {nullValue: null} downloadURL : {stringValue: 'https://firebasestorage.googleapis.com/v0/b/next-a…=media&token=e69edd61-89cd-477c-bebe-9216006ec651'} email : {stringValue: 'sample1235@sample.com'} id : {stringValue: '0qni813FvMyCEiEq7VIt'} likes : {integerValue: '0'} netabare : {stringValue: 'ネタバレ有'} photoURL : {nullValue: null} selected : {arrayValue: {…}} timestamp : {timestampValue: '2022-12-29T10:49:01.850Z'} title : {stringValue: '黒ひげがコビーは攫った理由'} userid : {stringValue: 'IJAZEmvnDSMsxchBCP1r3lSxSjK2'} [[Prototype]] : Object name : "projects/next-auth-app-2aa40/databases/(default)/documents/posts/0qni813FvMyCEiEq7VIt" updateTime : "2022-12-31T01:57:09.003408Z" [[Prototype]] : のようなデータになったのですが、 ここから const paths = data.map((post) => { return { params: { id: post.id.toString() }, }; }); の部分をうまくidに合うように変える感じでしょうか。
uky

2022/12/31 12:14

> の部分をうまくidに合うように変える感じでしょうか。 jsonを正しくオブジェクトの配列として復元すれば、 ``` const paths = data.map((post) => { return { params: { id: post.id.toString() }, }; }); ``` このコードでpathsが取れるようになるはずです。
Shmupeiii

2022/12/31 14:54

連絡ありがとうございます。 今試したことに画像追加したのですが、 json型でもエラーになってしまいました。 これがエラーになるのは、 取得したいidがfiledsの下の階層にある感じなのですが、それで上手く取得できずエラーになっている感じでしょうか。よろしくお願いします。 よろしくお願いします。
uky

2023/01/01 07:38

ですね post.id.toString() としているところを、 post.fields.id.toString() としてみてください!
Shmupeiii

2023/01/01 12:04

連絡ありがとうございます。 取得することができました。ありがとうございます。
guest

回答3

0

ukyさんのコメントにて解決できました。

質問へのコメントによって解決につながったということで対応内容の記載です。

解消までの流れ

簡単に手順です

エラーより、型がおかしい

TypeError: data.map is not a function

発生しているエラーより、質問者の想定と違い、dataが配列ではないのでは?と疑う。
→ 確認してもらったところ配列ではなかった。

jsonを取り扱っているようだったので、変数dataを作成しているところを確認

js

1const data = await res.json();

上記が想定であれば配列で返ってくる、とのことだったがなぜかstringで返ってきている模様。

json()は本来JSONで表現できるものならどのような値でも取りうるため、配列も返却されるはずだが、resで取れる内容は一見正しそうなため、今回はjson()で生成された文字列をJSON.parse(data)に突っ込んで配列を取得する方針での解消とした。

オブジェクトのプロパティへのアクセス

上記で本来のエラーは解消されたが、それでも取得したいidがとれないとのことで、質問に添付の画像からオブジェクトの構造を確認したところ、

以下のような構造ではなく、

js

1{ 2 context: "サンプル", 3 id: "サンプルID" 4 ... 5}

以下のようになっていた

js

1{ 2 fields: { 3 context: "サンプル", 4 id: "サンプルID" 5 ... 6 } 7}

そのため、もともとpost.id.toString()としていたところをpost.fields.id.toString()としてもらうことでバグを解消できた。

オブジェクトの操作で迷った時は以下参考にしてみてください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects

投稿2023/01/02 03:21

uky

総合スコア207

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

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

0

自己解決

ukyさんのコメントにて解決できました。

投稿2023/01/01 12:11

Shmupeiii

総合スコア105

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

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

0

公式と比べると記法がブレてませんか? 以下ではいかがでしょう

js

1 const paths = data.map((post) => ({ 2 params: { id: post.id.toString() } 3 })); 4

https://nextjs.org/docs/api-reference/data-fetching/get-static-paths

投稿2022/12/31 07:50

yuma.inaura

総合スコア1453

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問