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

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

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

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

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

React.js

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

Q&A

解決済

1回答

218閲覧

[Next.js] バックエンド側のAPI取得時にCORSエラーでfetch失敗する。

donut4

総合スコア170

Next.js

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

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

React.js

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

0グッド

0クリップ

投稿2024/09/20 07:37

編集2024/09/20 23:35

実現したいこと

Next.jで自作アプリを作っています。(Next.jsは初心者です。)
PropsやStateの仕組みを少し理解できたと思うところでリストを作ろうとしていますがうまくいきません。サーバーサイド言語とフロントを別々にして作っていて、fetch関数でサーバーからのデータを取得していますが、fetch関数実行時に「TypeError: Failed to fetch」のエラーがでて失敗します。

作ろうとしているリストは、一番下に"さらに表示"ボタンのようなボタンがあり、それを押すごとにN個ずつ外部から続きのリストデよータを取得してきて、後ろに追加していき縦に長くなっていくようなものです。

実装的な構想としては、コンポーネントが呼ばれたらリストのデータをfetchしてきて、それをuseState()で監視させ、リストの更新時には再度fetchしてきて既存のリストデータと合体させるような形で更新していくような作りを想定しています。(この作成方針で絶対実現したいとかではなく、自分の技術レベルの範囲内で実現方法を考えた結果たどり着いた方法です。)

9/21 8:00追記
ブラウザのコンソールを見ると、画像のようなエラーが出ていて、これを調べたらCORSエラーというエラーが原因となっているようでした。
イメージ説明
解消方法を調べてみたところ、通信時のhttpヘッダにアクセスを許可するような修正が必要との様子だったのでこちらを参考にfetch関数を後述の通り修正を加えました。
ですが変わらず、コンソール上でエラー出ています。
解消方法をご存じの方いたらよろしくお願いしまします。

発生している問題・分からないこと

前置きが長くなりましたが、問題となっているのは、後述するソース内でfetch関数が裏で失敗しているところです。エラー画面上に「TypeError: Failed to fetch」と大きく表示されています。(それ以前に呼ばれたコンポーネント内の要素は描画されている)

解決方法をご存じの方がいたらよろしくお願いします。

該当のソースコード

"use client"; import { useEffect, useState } from 'react'; import { fetchUser } from '@/lib/getter'; const getUserList = async () => { const userList = await fetchUser(); //3fetchUser()内でfetch関数が呼ばれリストのデータが返される(ここで失敗する。) return userList; }; export default function MakeList() { //1コンポーネントが呼ばれる const [userList, setUser] = useState([{}]); useEffect(() => { const fetchedUser = getUserList(); //2useEffectが実行されgetUserList()が呼ばれる setUser(fetchedUser) //4取得したリストデータをsetUser()で監視する。(エラーのためここは実行されない) }, []); return ( <> {userList?.map((obj) => ( <React.Fragment key={obj.lisId}> <div key={obj.lisId}> <div> {obj.user} </div> </div> </React.Fragment> ))} </> ); }
////以下のような構造でリストデータを作り、userListで監視させようとしています。 listData: [ { user: "田中", listId: "1", }, { user: "佐藤", listId: "2", } //更新するごとに続きが追加されていくような ]

9/21 8:00追記
修正したfetchのソース

const res = await fetch(`http://localhost:3000/top?XXXXXXX=${XXXXXXXX}`, { headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", }, method: 'GET', cache: 'no-store', }); const result = await res.json();

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラー画面

補足

Next.jsバージョン:(14.2.11)

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

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

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

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

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

Lhankor_Mhy

2024/09/21 00:30

Next.js は全く分からないのですが、ソースを拝見すると、Access-Control-Allow-Origin などのヘッダをリクエストにつけているように見えました。ご提示いただいた参考ページはレスポンスにつけているように見えるのですが、そうではないのですか?
Lhankor_Mhy

2024/09/21 00:33

また、fetch関数のスクリーンショットを見ると単純リクエストではなさそうに思えますので、参考ページに書かれている通りプリフライトにも対応する必要があると思います。
donut4

2024/09/23 13:53

回答ありがとうございます。 バックエンド側でアクセスを許可することも可能とのことなのでその方法を試して、そちらで解決しました。
guest

回答1

0

自己解決

バックエンド側でアクセスを許可することも可能とのことなので、
その方法を試して、そちらで解決しました。

投稿2024/09/23 13:52

donut4

総合スコア170

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問