How to Fix: "RangeError: Maximum call stack size exceeded" in angular7 when passing token as parameter
How to Fix: "RangeError: Maximum call stack size exceeded" in angular7 when passing token as parameter
我正在尝试完成 "Password Recover" 功能。密码重置 URL 包含电子邮件参数和令牌(使用 GeneratePasswordResetTokenAsync(TUser) dotnet 核心身份函数生成)。
现在的问题是,每当重置 URL 在浏览器上加载时,它都会给出:RangeError: Maximum call stack size exceeded
Screenshot attached
为了找出问题所在,我从 url 中删除了令牌,并在代码中的一个变量中进行了硬编码以观察结果,但它工作得非常好,没有任何例外。
此外,组件中没有可能导致问题的循环依赖。我不明白是什么导致了这个问题。
screenshot attached
PS:我在前端使用 Angular 7,在后端使用 C#
EDIT:在进一步调查中,我发现每当令牌在令牌字符串之间包含 (%2) 时就会发生异常{当我用 "System.Web.HttpUtility" 编码 URL } 或 / {当我不执行编码时}
See Image
URL有什么限制吗?来自 app.component.ts
的代码片段
setTimeout(() => {
if (this.isUserLoggedIn) {
this.alertService.resetStickyMessage();
this.checkAvailableStocks();
if (this.isUserLoggedIn && this.UserRole == 'Worker/Staff' && !this.storageManager.getData(DBkeys.SELECTED_COMPANY)) {
let dialogRef = this.dialog.open(CompanyDialogeComponent, {
//width: '800px',
data: {},
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
});
}
//if (!this.authService.isSessionExpired)
this.alertService.showMessage("Login", `Welcome back ${this.userName}!`, MessageSeverity.default);
//else
// this.alertService.showStickyMessage("Session Expired", "Your Session has expired. Please log in again", MessageSeverity.warn);
}
}, 2000);
this.alertService.getDialogEvent().subscribe(alert => this.showDialog(alert));
this.alertService.getMessageEvent().subscribe(message => this.showToast(message, false));
this.alertService.getStickyMessageEvent().subscribe(message => this.showToast(message, true));
this.authService.reLoginDelegate = () => this.shouldShowLoginModal = true;
this.authService.getLoginStatusEvent().subscribe(isLoggedIn => {
this.isUserLoggedIn = isLoggedIn;
if (this.isUserLoggedIn) {
this.initNotificationsLoading();
}
else {
this.unsubscribeNotifications();
}
setTimeout(() => {
if (!this.isUserLoggedIn) {
this.alertService.showMessage("Session Ended!", "", MessageSeverity.default);
}
}, 500);
});
this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
let url = (<NavigationStart>event).url;
if (url !== url.toLowerCase()) {
this.router.navigateByUrl((<NavigationStart>event).url.toLowerCase());
}
}
});
我在使用 dotnet core 开发 Angular 时遇到过类似的问题。
您应该从应用程序组件中删除这段代码,因为这段代码将 dotnet core 生成的密码重置令牌变成小写并在小写后重定向
this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
let url = (<NavigationStart>event).url;
if (url !== url.toLowerCase()) {
this.router.navigateByUrl((<NavigationStart>event).url.toLowerCase());
}
}
});
我正在尝试完成 "Password Recover" 功能。密码重置 URL 包含电子邮件参数和令牌(使用 GeneratePasswordResetTokenAsync(TUser) dotnet 核心身份函数生成)。 现在的问题是,每当重置 URL 在浏览器上加载时,它都会给出:RangeError: Maximum call stack size exceeded
Screenshot attached
为了找出问题所在,我从 url 中删除了令牌,并在代码中的一个变量中进行了硬编码以观察结果,但它工作得非常好,没有任何例外。
此外,组件中没有可能导致问题的循环依赖。我不明白是什么导致了这个问题。 screenshot attached PS:我在前端使用 Angular 7,在后端使用 C#
EDIT:在进一步调查中,我发现每当令牌在令牌字符串之间包含 (%2) 时就会发生异常{当我用 "System.Web.HttpUtility" 编码 URL } 或 / {当我不执行编码时}
See Image
URL有什么限制吗?来自 app.component.ts
的代码片段setTimeout(() => {
if (this.isUserLoggedIn) {
this.alertService.resetStickyMessage();
this.checkAvailableStocks();
if (this.isUserLoggedIn && this.UserRole == 'Worker/Staff' && !this.storageManager.getData(DBkeys.SELECTED_COMPANY)) {
let dialogRef = this.dialog.open(CompanyDialogeComponent, {
//width: '800px',
data: {},
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
});
}
//if (!this.authService.isSessionExpired)
this.alertService.showMessage("Login", `Welcome back ${this.userName}!`, MessageSeverity.default);
//else
// this.alertService.showStickyMessage("Session Expired", "Your Session has expired. Please log in again", MessageSeverity.warn);
}
}, 2000);
this.alertService.getDialogEvent().subscribe(alert => this.showDialog(alert));
this.alertService.getMessageEvent().subscribe(message => this.showToast(message, false));
this.alertService.getStickyMessageEvent().subscribe(message => this.showToast(message, true));
this.authService.reLoginDelegate = () => this.shouldShowLoginModal = true;
this.authService.getLoginStatusEvent().subscribe(isLoggedIn => {
this.isUserLoggedIn = isLoggedIn;
if (this.isUserLoggedIn) {
this.initNotificationsLoading();
}
else {
this.unsubscribeNotifications();
}
setTimeout(() => {
if (!this.isUserLoggedIn) {
this.alertService.showMessage("Session Ended!", "", MessageSeverity.default);
}
}, 500);
});
this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
let url = (<NavigationStart>event).url;
if (url !== url.toLowerCase()) {
this.router.navigateByUrl((<NavigationStart>event).url.toLowerCase());
}
}
});
我在使用 dotnet core 开发 Angular 时遇到过类似的问题。
您应该从应用程序组件中删除这段代码,因为这段代码将 dotnet core 生成的密码重置令牌变成小写并在小写后重定向
this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
let url = (<NavigationStart>event).url;
if (url !== url.toLowerCase()) {
this.router.navigateByUrl((<NavigationStart>event).url.toLowerCase());
}
}
});