実現したいこと
Rustで自作アプリを作っています。
サーバーサイド言語とフロント(JavaScript)を別々にして作っていて、フロント側でfetchを利用してPOST通信をしていますが、axumで処理したデータを、うまくフロント側に返せず、解決方法がわからない状態です。
簡単なログイン処理を作っていて、フロント側のfetch関数でバックエンド側に値を渡し、ログインチェック後にステータスコードとJSON形式のデータをフロントに返して、その先の処理を制御させるようなものを作ろうとしていますが、JSON形式のデータの取得がうまくいきません。
(別の個所で、「 axum::Json<serde_json::Value>」の返り値でベクタやHashMapを返す処理はうまくいっているので、自分が設定した返り値が誤っているような気がします。)
解消方法をご存じの方いたらよろしくお願いしまします。
発生している問題・分からないこと
先述した通り、axumで処理したデータを、うまくフロント側に返せず、解決方法がわからない状態です。
Rust側では処理が正常に終わっているようなのですが、フロント側でうまくバックエンド側のデータが取得できていないように見受けられます。
※補足に追記しました。
fetchにthenを使うとバックエンド側のデータが取得できているような挙動が見受けられました。
フロント側の挙動
バックエンド側でログイン成功ルートに入って処理完了後、なぜかフロント側で200系以外としてみられる
該当のソースコード
login.rs
1//レスポンスデータ生成箇所以外はイメージです 2//返却時には、「(StatusCode::OK, Json(response)).into_response()」とステータスとメッセージのような形で返却しています。 3//返却の型には「impl IntoResponse」も試したりもしました。 4#[derive(Deserialize)] 5struct LoginRequest { 6 username: String, 7 password: String, 8} 9 10 #[derive(Serialize)] 11 pub struct LoginResponse { 12 message: String, 13} 14 15// ログイン処理を行うハンドラ 16async fn login_handler(Json(payload): Json<LoginRequest>) -> Response { 17 let LoginRequest { username, password } = payload; 18 19 // 簡単なログイン処理(ここではユーザー名とパスワードのチェック) 20 if username == "admin" && password == "password123" { 21 22 // ログイン成功時 23 let response = LoginResponse { 24 message: "ログイン成功".to_string(), 25 }; 26 (StatusCode::OK, Json(response)).into_response() 27 28 } else { 29 30 // ログイン失敗時 31 let response = LoginResponse { 32 message: "ログイン失敗".to_string(), 33 }; 34 (StatusCode::UNAUTHORIZED, Json(response)).into_response() 35 } 36}
fetchAuth.js
1//Rust側でログイン成功ルートに入っても200系以外としてみられる 2//メッセージを取得しようとして例外が発生する。 3 4export function fetchAuth(form) { 5 6 try { 7 const response = fetch(`http://localhost:3000/aaa`, { 8 cache: 'no-store', 9 method: 'POST', 10 headers: {'Content-Type': 'application/json'}, 11 body: JSON.stringify(form) 12 }) 13 14 // レスポンスが成功(200系)かどうかをチェック 15 if (!response.ok) { //なぜかRust側でログイン成功ルートに入ってもこちらに入る 16 const errorData = response.json(); //ここからメッセージを取得しようとして失敗してcatch に入る 17 console.error('Error:', errorData.message); 18 // エラーの場合の処理 19 return Promise.reject(new Error(errorData.message)); 20 } 21 22 const data = response.json(); 23 console.log('Success:', data.message); 24 // 成功の場合の処理 25 return Promise.resolve(data.message); 26 } catch (error) { //"error"の内容は「message = 'response.json is not a function'」 27 console.error('Network error:', error); 28 // ネットワークエラーなどのハンドリング 29 return Promise.reject(new Error('Network error occurred')); 30 } 31}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
先述した通り、いろいろ試行錯誤しても、フロント側でうまくバックエンド側のデータが取得できていないように見受けられる事象が発生している。
補足
追記
fetch後の処理にthenを使ってみてバックエンド実行後の"data"を確認してみると、なぜかはわかりませんが、このやり方ではステータスの取得ができてました。
10/3 16:25頃追記
ソースを修正して再度試しましたがうまくいかず。
(then、catchいずれの中にも入らず、ただバックエンドの処理が終わりそのあとは何もしていないように見見受けられました。※URLをloginに変えました。バックエンドのurlも修正済み)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/10/03 07:24
2024/10/03 08:28 編集