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

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

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

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

Q&A

解決済

1回答

2396閲覧

Reactでreact-router-domを使用しているがPOSTリクエストが「Cannot POST /xxxxx」となってしまう。

f6ae

総合スコア92

React.js

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

0グッド

0クリップ

投稿2022/12/18 14:46

GETリクエストだと正常に文字列「test」がブラウザに表示されるのですが、
POSTリクエストだと
「Cannot POST /xxxxx」
という風に表示されてしまいます。
どのようにすればPOSTでのリクエスト時にページを表示出来るでしょうか?

App.js

1import { BrowserRouter, Routes, Route } from "react-router-dom"; 2 3function App() { 4 return ( 5 <BrowserRouter> 6 <Routes> 7 <Route path={'/xxxxx'} element={<p>test</p>} /> 8 </Routes> 9 </BrowserRouter> 10 ); 11} 12 13export default App; 14

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

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

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

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

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

hoshi-takanori

2022/12/19 07:27

えっと、その GET とか POST とかはいわゆる AJAX ですか? それとも画面遷移ですか? (react-router を使うなら画面遷移そのものでは GET も POST もしないはず…)
f6ae

2022/12/19 11:28

AJAXか画面遷移かというのが、よく意味がわかっておりませんが、 外部から/xxxxxに対してPOSTリクエストをした時ということです。 たとえば cur localhost:3000/xxxxx とGETでリクエストを送った場合はtestという文字列が返ってきますが、 curl -X POST localhost:3000/xxxxx としたときに、 「Cannot POST /xxxxx」と出てしまうということです。
hoshi-takanori

2022/12/19 12:41

React は基本的にはブラウザ上で動くのですが、外部から POST するとは???
f6ae

2022/12/19 15:10

すみません、前回のコメントについては正しくありませんでした。(curlではなくブラウザでのアクセス時とすべきでした。) Reactの処理自体はサーバではなくブラウザ側で行われることは理解しているのですが、 たとえばFormのボタンをクリックしてSubmitで画面遷移をさせる場合などに、POSTリクエストで画面遷移となると思います。(たとえば/aaaaaから/xxxxxに画面遷移) ここでPOSTされたデータを/xxxxxのReactの処理で取得する事が出来るのではと考えていたのですが、出来ないのでしょうか? そしてそれ以前に、GETでのアクセスだろうがPOSTでのアクセスだろうが同じ画面表示(同じ処理)を行いたいのに、POSTだと「Cannot POST /xxxxx」となってしまうのも何故なのか理解出来ておりません。
hoshi-takanori

2022/12/20 05:35

えっと、どこから説明したものか…。 まず、普通に a タグで <a href="/aaaaa"> のようにリンクを張ると、react-router の機能は発動せず、ブラウザは GET /aaaaa という HTTP リクエストを行い、新しいページに遷移してしまいます。これを防ぐために、react-router では a タグは使わずに <Link to="/aaaaa"> のように書きます。これにより、react-router は HTTP リクエストを発行せずに画面を書き換えると同時に、ブラウザ上で履歴を操作して新しいページに遷移したように見せかけます。 同様に、普通に form タグを使って <form method="GET" action="/xxxxx"> として送信ボタンを押すと、ブラウザは GET /xxxxx という HTTP リクエストを行って新しいページに遷移することになります。 なお、この際、本来はサーバー側で /aaaaa や /xxxxx というリクエストに対応する HTML ファイルを用意しておく必要がありますが、react の開発環境 (create-react-app で作ったプロジェクトなど) では webpack-dev-server という開発用のサーバーが動いていて、/aaaaa や /xxxxx などの未知のリクエストに対してはデフォルトの index.html を返すので、何事もなかったかのように動きますが、実際にデプロイする際にはこの辺の仕組みも何とかする必要があります。 ところが、<form method="POST" action="/xxxxx"> の場合、GET ではなく POST /xxxxx という HTTP リクエストが行われ、webpack-dev-server は POST には対応してないのでエラーになります。というか、そもそも生の form タグを使って GET や POST を送信されてしまうのは react-router 的には間違いで、送信ボタンを押した際の処理を乗っ取って自分で処理する (または、その辺を何とかしてくれるライブラリを使う) 必要があります。
yuta_22

2023/01/11 09:48

解決済みかもしれませんが、補足です^^ 通常のウェブサイトではPOST後に画面遷移する挙動が入りますが、Reactでは全く違う考え方をする場合が多いです。 直前の方がおっしゃる通り、formのsubmitイベントを補足、submitイベントが発生した後に通常のsubmit処理(データをサーバーに送信 & リダイレクト)を完全にキャンセル、自前でサーバーにデータを送信、自前で別のページにリダイレクトさせる、という処理を行います。(最後のリダイレクトは、むしろやってもやらなくても良いです) 英語ですが、こちらのサイトの1つ目のサンプルコードがまさにそれです。(`event.preventDefault()`がデフォルトの処理をキャンセル、`navigate('/contacts')`がページ遷移) https://bobbyhadz.com/blog/react-redirect-after-form-submit また、formのsubmitイベントを補足する他に、formタグを使わず送信ボタンのclickイベントを補足する方法もあります。お作法的には前者の方が良いですが、後者の実装もよく見かけます。興味があれば調べてみてください!
f6ae

2023/01/19 14:07

どうも有難うございます。 Reactの作法について再度勉強致します!
guest

回答1

0

自己解決

Reactの作法について再度確認します!

投稿2023/01/19 14:11

f6ae

総合スコア92

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問