在 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 不能正常工作,但目前可以使用。
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 不能正常工作,但目前可以使用。