web-dev-qa-db-ja.com

ナビゲーションIDが現在のルーターのナビゲーションIDエラーと等しくありません

Angularv5アプリで @ ngrx/router-store を使用していて、最近エラーが発生し始めました:Navigation ID X is not equal to the current navigation id Y(XとYは整数です)。

この問題は、特定のルートBからルートAにナビゲートすると常に発生します。他のルートからルートAにナビゲートすると、正常に動作するようです。

私が見つけた唯一の他の これに関連するS.O.の問題 は、問題がナビゲーションを何度も急速に更新することによって引き起こされる可能性があることを示しています。これが起こっているかどうかをテストするために(そうすべきではない)、ルートコンポーネント内のルーターナビゲーションイベントにサブスクライブし、サブスクリプション内にブレークポイントを設定して、デバッグセッションを開いて問題をステップスルーしました。これを行うと、私はそれを見ることができます

  1. 現在のナビゲーションIDが11であるとします。問題のあるルートに移動すると、ルーターがナビゲーションを開始し、NavigationEndを含むすべてのナビゲーションイベントを正常に実行し、すぐに@ ngrx/router-storeが'ROUTER_CANCEL'アクションをスローしますNavigation ID 12 is not equal to the current navigation id 13。私が知る限り、12は正しいナビゲーションIDです(この場合も、ナビゲーションID 11が完了し、すぐに'ROUTER_CANCEL'がスローされ、ルーターはそれ以上のナビゲーションイベントを発行しません)。さらに、'ROUTER_CANCEL'アクションペイロードには、問題を引き起こしたルーターナビゲーションイベントと、問題が発生したときのストアの状態の両方が含まれています。問題の原因となったイベントのIDは12で、そのときのストアのルーター状態のIDは11でした。したがって、12は正しいナビゲーションIDのようで、エラーをスローするべきではありません。

  2. 問題のあるルートからユーザープロファイルルートへのナビゲーションでは、@ ngrx/router-storeがナビゲーションをキャンセルするまで、他のナビゲーションは発生しません。 (つまり、ナビゲーションルートを迅速に更新していません)

  3. Ngrxが'ROUTER_CANCEL'アクションをディスパッチする以外は、エラーは報告されません(エラーはスローされません)。

繰り返しになりますが、問題が発生しているルートは、ナビゲーションが特定のルートBから開始されない限り正常に機能します。私が知る限り、この特定のルートBに違いや異常はありません(問題のあるルートAもまた、人々がどこから来ているのか気にしません- 2つのルートは互いに関連付けられていません)。

最後に、デバッグセッションの外部でバグをトリガーすると、常にNavigation ID X is not equal to the current navigation id X+1という形式のエラーが発生するように見えますが、デバッグセッションの内部でバグをトリガーすると、Navigation ID 11 is not equal to the current navigation id 15またはNavigation ID 13 is not equal to the current navigation id 20などが発生する可能性があります。

誰かが何が起こっているのか考えていますか? @ ngrx/router-storeに慣れていないので、これがどのように発生するかを実際に推測することはできません。私の想定では、@ ngrx/router-storeがNavigationEndイベントを受信すると、ストア内のナビゲーションID値が同期的に増加するため、IDがどのようにできるかさえわかりませんever順不同になります--- IDが正しいように見える場合は、この場合は1つだけです。

どんな考えでも大歓迎です!

PS:私はコードを投稿してうれしいですが、私のアプリは大きく、このバグがどこからトリガーされているのかについての手掛かりはありません。

19
John

私はそれを考え出した! NavigationEndイベントでrouter.navigate()を呼び出していたコンポーネントにがありました。したがって、答えは このS.O.の問題 (ルートを迅速に変更する)の答えに似ていました。

27
John

同様の問題に遭遇したので回答を投稿しますが、なぜそれが起こったのかを見つけるのは困難でした。それがここで終わる他の人を助けることを願っています...

この問題が発生した場合、クエリパラメータをリセットする呼び出しが原因である可能性もあります。たとえば、ngOnDestroyメソッド呼び出しでは:

public ngOnDestroy(): void {
  // Removing query params on destroy:
  this.router.navigate([], {
    relativeTo: this.route,
    queryParams: {},
    queryParamsHandling: 'merge',
    replaceUrl: true,
  });
}

このメソッドでは、ルートに存在するクエリパラメータはコンポーネントのngOnDestroyメソッドで削除されます。この方法のため、@ Johnが彼の回答で言及したのと同様に、ルートは急速に変化します。同じ問題が発生します:NavigationCancelイベントが発生し、次のメッセージが表示されます:

NavigationCancel {id: x, url: "/parent/child", reason: "Navigation ID x is not equal to the current navigation id x+1"}
  id: x
  url: "/parent/child"
  reason: "Navigation ID x is not equal to the current navigation id x+1"

その結果、NavigationEndは決して起動しません。


注:次のことができます ルーター設定でトレースを有効にするExtraOptions param enableTracingtrueに設定すると、この問題のデバッグが容易になります。

1
Wilt

私は同じ問題を抱えていて、ブラウジングデータを消去するまで1週間行き詰まり、すべてが問題なく動作しました。