-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
カスタムエラーハンドラーをプラグイン化して循環参照を防ぐ #1361
The head ref may contain hidden characters: "feature/\u30AB\u30B9\u30BF\u30E0\u30A8\u30E9\u30FC\u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u30D7\u30E9\u30B0\u30A4\u30F3\u5316\u3057\u3066\u5FAA\u74B0\u53C2\u7167\u3092\u9632\u3050"
Conversation
対象にAzure AD B2Cサンプルがないですけど、これは認識通りですか? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Marisの方では error-handler.ts を削除しているようです。こちらも custom-error-handler.ts に置き換わっていると思うので削除してください。
出来ればグローバルエラーハンドラーもカスタムエラーハンドラーと形式をそろえたいです。 カスタムエラーハンドラーとグローバルエラーハンドラーで用途が違うため、use-の形式はグローバルエラーハンドラーでは不要でした。 |
些末な内容で恐縮ですが、先に下記について修正させてください。 |
@tsuna-can-se |
@1nu1taichi |
@KentaHizume |
注意
マイルストーンv1.0までのフロントエンドの変更をMaiaに寄せるために、
レビュー中にMaris⇒MaiaへPRの移動を行いました。
途中のコメントはMarisの下記のPRを参照願います。
このプルリクエストで実施したこと
errorHandler
関数をVueのプラグインに書き換えました。global-error-handler
に変更し、責務を明確化するとともにカスタムエラーハンドラーと形式を揃えました。
モチベーション
エラーハンドラーから直接routerの実装をimportしたうえで、画面からエラーハンドラーをimportすると、動作自体は期待通りになるが、循環参照になってしまうという問題があります。
(例)CataogView⇒ErrorHandler⇒router⇒catalogRoutes⇒CatalogView
プラグインを使ったprovide/injectを用いることで、この問題を解決します。
具体的には、
App(親コンポーネント)でハンドラーをInjectionKeyに紐づけてprovideし、
各画面(子コンポーネント)ではInjectionKeyを経由してInjectすることで、循環参照を避けることができます。
確認した点
注文処理実行時に401エラーが発生した際、想定通りログイン画面にルーティングされるよう修正されたことを確認しました。
下記のコメントのケースについて、修正前と動作が変わらないことを確認しました。
グローバルエラーハンドラーについて、修正前と同様、
想定外エラーの発生時にコンソールにログ出力してエラーページに遷移することを確認しました。
このプルリクエストでは実施していないこと
ドキュメントの修正については別issue、PRにて対応いたします。
AzureADB2Cサンプルへの修正については別issue、別PRにて対応いたします。
Issue や Discussions 、関連する Web サイトなどへのリンク
プラグインの実装形式
プラグインの実装形式については、
vue-routerとpiniaを参考にしました。
inject時の非NULLアサーションの使用
injectする際に非NULLアサーションを使用しています。
return inject(customErrorHandlerKey)!;
対応するKeyのリソースをprovideしていなかった場合にNULLとなるためです。
そのため、main.tsで
app.use
を書き忘れた場合は実行時エラーになります。ただし、
・テスト時に確実に発覚する
・vue-routerでも同様の実装となっている
という理由から、特別処理する必要はないと考えます。
プラグインが役立つユースケース
グローバルエラーハンドラーは
[app.config.globalProperties](https://ja.vuejs.org/api/application.html#app-config-globalproperties) にグローバルなインスタンスプロパティやメソッドを追加する。
に対応し、カスタムエラーハンドラーは
[app.provide()](https://ja.vuejs.org/api/application.html#app-provide) を呼び出して、アプリケーション全体でリソースを[注入できる](https://ja.vuejs.org/guide/components/provide-inject.html)ようにする。
に対応します。useで始まる名称の使用
カスタムエラーハンドラーはuseで始まる名称の関数でラップしています。
このことにより、カスタムエラーハンドラーを利用する子コンポーネントから、
inject()
構文を隠蔽することができます。一方でグローバルエラーハンドラーは子コンポーネントから明示的に呼び出すことがないので、
特にラップする必要はないと考えます。
use~はコンポーザブル関数に対する命名の慣例とされています。