web-dev-qa-db-fra.com

L'ID de navigation n'est pas égal à l'erreur d'ID de navigation actuelle du routeur

J'utilise @ ngrx/router-store dans mon application Angularv5 et j'ai récemment commencé à rencontrer une erreur: Navigation ID X is not equal to the current navigation id Y (où X et Y sont des entiers).

Ce problème se produit régulièrement lorsque je navigue vers l'itinéraire A à partir d'un itinéraire spécifique B. La navigation vers l'itinéraire A à partir de tout autre itinéraire semble fonctionner correctement.

Le seul autre problème S.O. lié à cela que j'ai trouvé, offre la possibilité que le problème puisse être causé par une mise à jour rapide de la navigation plusieurs fois. Pour tester si cela se produisait (ce ne devrait pas être le cas), je me suis abonné aux événements de navigation du routeur dans mon composant racine, j'ai défini un point d'arrêt dans l'abonnement et ouvert une session de débogage pour résoudre le problème. Ce faisant, je peux voir que

  1. Supposons que l'ID de navigation actuel soit 11. Lorsque je navigue vers l'itinéraire problématique, le routeur démarre la navigation, exécute avec succès chaque événement de navigation, y compris NavigationEnd, puis immédiatement @ ngrx/router-store lance un 'ROUTER_CANCEL' action indiquant que: Navigation ID 12 is not equal to the current navigation id 13. Pour autant que je sache, 12 est l'ID de navigation correct (encore une fois, l'ID de navigation 11 se termine et immédiatement 'ROUTER_CANCEL' est lancé sans que le routeur n'émette d'autres événements de navigation). De plus, le 'ROUTER_CANCEL' l'action payload contient à la fois l'événement de navigation du routeur qui a provoqué le problème, ainsi que l'état du magasin lorsque le problème a été causé. L'événement qui a causé le problème a un ID de 12, l'état du routeur dans le magasin à l'époque avait un ID de 11. Encore une fois, 12 semble être l'ID de navigation correct et ne devrait pas générer d'erreur.

  2. Lors de la navigation vers l'itinéraire du profil utilisateur à partir d'un itinéraire problématique, aucune autre navigation ne se produit jusqu'à ce que @ ngrx/router-store annule la navigation. (c'est-à-dire que je ne mets pas à jour rapidement l'itinéraire de navigation)

  3. Autre que ngrx envoyant un 'ROUTER_CANCEL' action, aucune erreur n'est signalée (et aucune erreur n'est générée).

Encore une fois, l'itinéraire connaissant des problèmes fonctionne bien, sauf si la navigation commence à partir d'un itinéraire spécifique B. Pour autant que je sache, il n'y a rien de différent ou d'inhabituel à propos de cet itinéraire spécifique B (et l'itinéraire problématique A ne se soucie pas non plus de la provenance des personnes-- les deux itinéraires ne sont pas associés l'un à l'autre).

Une dernière chose: le déclenchement du bogue en dehors d'une session de débogage semble toujours provoquer des erreurs sous la forme Navigation ID X is not equal to the current navigation id X+1, mais le déclenchement du bogue dans une session de débogage peut entraîner Navigation ID 11 is not equal to the current navigation id 15 ou Navigation ID 13 is not equal to the current navigation id 20, etc.

Quelqu'un at-il une idée de ce qui se passe? Je ne connais pas suffisamment @ ngrx/router-store pour vraiment deviner comment cela pourrait se produire. Mon hypothèse est que la valeur de l'ID de navigation dans le magasin augmente de manière synchrone lorsque NavigationEnd événements sont reçus par @ ngrx/router-store, donc je ne suis même pas sûr de savoir comment les ID pourraient jamais hors service --- et encore moins dans ce cas où les identifiants semblent être corrects.

Toutes les pensées sont grandement appréciées!

PS: Je suis heureux de poster du code, mais mon application est grande et je n'ai aucune idée de l'origine de ce bug.

19
John

Je l'ai compris! Il y avait du code dans un composant qui appelait router.navigate() sur un événement NavigationEnd. La réponse était donc similaire à la réponse de ce problème S.O. (changement rapide d'itinéraire).

27
John

Publiera une réponse, car j'ai rencontré un problème similaire, mais il était difficile de trouver pourquoi cela s'est produit. J'espère que cela aidera les autres à se retrouver ici ...

Lorsque vous rencontrez ce problème, il peut également être provoqué par un appel pour réinitialiser les paramètres de requête. Par exemple, dans un appel de méthode ngOnDestroy:

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

Dans la méthode, tous les paramètres de requête présents dans la route sont supprimés dans la méthode ngOnDestroy d'un composant. En raison de cette méthode, l'itinéraire change rapidement, tout comme les mentions @John dans sa réponse. Cela conduit au même problème: NavigationCancel l'événement est déclenché avec le message suivant:

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"

Et par conséquent NavigationEnd ne se déclenchera jamais.


Remarque: Vous pouvez activer le traçage dans la configuration de votre routeur ExtraOptions avec le paramètre enableTracing défini sur true pour faciliter le débogage de ce problème.

1
Wilt

j'ai eu le même problème, et je suis resté coincé pendant une semaine, jusqu'à ce que je nettoie mes données de navigation, et tout fonctionne très bien.