在 router.navigate 中使用特殊字符似乎会导致无限循环

using special character in router.navigate appears to cause infinite loop

Gmail 允许在末尾添加其他内容以向同一地址发送电子邮件,即使该电子邮件已在使用中也是如此。像这样:

random.email+23287@gmail.com

我们有时会用它来进行测试。不幸的是,现在,每当我使用这种电子邮件进行导航时,我都会从我认为是由 + 符号

引起的 router.navigate() 的内置 URI 编码器中得到一个无限循环

我测试了其他特殊字符并得出结论,这个例子可能就是这种情况:

gotoconfirmationpage() {
    this.router.navigate(['/confirmation', '%@gmail.com']);
  }

路由器看起来像这样:

  {
    path: 'confirmation/:email',
    component: ConfirmationComponent
  },

我也尝试过在导航之前进行预编码,但都是一样的。似乎对于任何被编码的字符,即 % 以及 #& 等其他字符,一旦您导航,您就会得到如下内容:

你的历史看起来像这样...

我不是专家,但我很确定 % 符号的编码结果是 %25 看起来它被编码了,然后导航再次看到它并继续"oh look another one!" 然后我们得到 %25252525252525252525... 到无穷大。

我检查了 navigation() 的开发页面,看起来这可能是一个存在的问题,但我还没有找到解决方案。如果有人有任何信息或解决方案,将不胜感激。

能否尝试使用以下方法对 URI 组件进行编码。

 gotoconfirmationpage() {
    this.router.navigate(['/confirmation', encodeURIComponent('%@gmail.com')]);
  }

在组件中,您可能还需要解码 URIcomponent 以获取实际值。

我很遗憾地告诉大家,如果你有这个错误,你不会在这里找到答案,虽然你可能会发现 @Rahul Tokase 的答案很有帮助,所以检查他的。

这个问题最终变成了一个意外的无限循环,我们的内部导航服务进入了路由器应用程序。它对 URI 进行编码,然后一遍又一遍地进行编码,因此您会得到 %,然后变成 %25,然后变成 %2525,依此类推。祝你好运。

我 运行 也遇到了这个错误,但找不到任何解决方案。对于我们来说,由于 AngularFireAuthGuard,我们似乎得到了重定向到另一个页面,被路由到页面然后在登录后重新路由回来(尽管我们已经登录)。该路由具有查询参数,然后将其编码如下

40.js:251 home?day=2&week=5
40.js:251 home%3Fday%3D2&week%3D5
40.js:251 home%253Fday%253D2&week%253D5
40.js:251 home%25253Fday%25253D2&week%25253D5
40.js:251 home%2525253Fday%2525253D2&week%2525253D5
...

然后我们的通配符路由会将其捕获为一条无法识别的路由,并将我们困在这个永远的循环中。删除通配符路由解决了错误,但我想保留通配符...

我最终进入 app.component.ts 并订阅路由器事件,在 URL 中寻找 % 并从那里手动重定向以停止循环。

this.router.events.subscribe(event => {
  if (event instanceof NavigationStart && event.url.indexOf('%') > -1) {
    this.router.navigate(['/tabs/home']);
  }
});

很想找到一个合适的解决方案来解决为什么首先要对参数进行编码,或者为什么 auth guard 不能正常工作,但目前可以使用。