Skip to content

ゲーム終了時にスコアの登録に失敗しましたと表示される #215

@h-takeyeah

Description

@h-takeyeah

緊急度

症状

タイピングゲームをプレイするとスコア登録する場面で必ずエラーになり,そこから前の画面に戻るのも先の画面に進むのもできません.ユーザには「スコアの登録に失敗しました」というトーストが表示されます.コンソールには下記エラーが出ています.

Score submission error: SyntaxError: Unexpected token 'ス', "スコアが正常に登録されました" is not valid JSON

再現手順

  1. typing-server(以下,バックエンド)を立ち上げる cd typing-server && docker compose -f docker-compose.dev.yml up
  2. 別の端末でtyping-app(以下,フロントエンド)を立ち上げる cd typing-app && yarn && yarn dev
  3. http://localhost:3000から00000001にログインして/gameへ遷移,実際にプレイする
  4. 1分(プレイ終了)後に当症状発生

考えられる原因

  • 直接の原因はフロントエンドが使用している openapi-fetch (バージョン0.13.3) というライブラリがデフォルトでレスポンスを JSON.parse しようとすることです
  • スコアの登録を担当する/scoresエンドポイントではレスポンスボディが「スコアが正常に登録されました」という文字列1であり JSON じゃないので上記のようなエラーが出ます

この issue で検討したいこと

問題に対しては改善案が2つあり(他の案も歓迎!),そのどちらを採用するか検討したい.

  • 案1 サーバとopenapi.yamlの修正
    • レスポンスボディの形式を統一
    • or いっそ何も返さないか
  • 案2 クライアントが openapi.yaml の仕様に沿うように修正
    • /scores エンドポイントのときだけただのテキストとして解釈する
    • or すべてのエンドポイントで JSON のパースをやめる

案1はレスポンスボディがエンドポイントによって違うのは煩雑だ,という意見に依拠する案.案1のポチ2つ目の裏話としては,昨年新入生に使ってもらったときはそんなエラー起きてなかったのになーと思って調べたら実は昨年のv0.0.2のあたりまではサーバはスコアを登録した際にステータスコード201を返すのみだったので問題は起きていなかったという事実があります(なんてことorz).その頃に戻せばいいんじゃない?という発想です(再発しそう?).

案2はクライアントが openapi.yaml の仕様に沿って適切に処理するべき,という意見に立脚した案です.その2つ目は「いっそ何も返さない」,に似てて「いっそ何もパースしない」ということです.パースしたけりゃ明示的にせい,という立場.

Footnotes

  1. https://su-its.github.io/typing/#tag/score/operation/registerScore

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions