Как исправить: «RangeError: Превышен максимальный размер стека вызовов» в angular7 при передаче токена в качестве параметра - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь выполнить функцию восстановления пароля. URL-адрес для сброса пароля содержит параметр электронной почты и токен (который генерируется с помощью функции идентификации ядра dotnet GeneratePasswordResetTokenAsync (TUser)). Теперь проблема заключается в том, что всякий раз, когда этот URL сброса загружается в браузер, он выдает: RangeError: Превышен максимальный размер стека вызовов

Снимок экрана прилагается

Чтобы выявить проблему, я удалил токен из URL-адреса и жестко закодировал переменную внутри кода, чтобы увидеть результаты, но он работал отлично, без исключений, что когда-либо.

Более того, в компоненте нет циклической зависимости, которая могла бы вызвать проблему. Я не понимаю, что является причиной этой проблемы. скриншот прилагается PS: я использую Angular 7 на переднем конце и C # на заднем плане

РЕДАКТИРОВАТЬ : при дальнейшем расследовании я обнаружил, что исключение возникает всякий раз, когда токен содержит либо (% 2) между строкой токена {когда я кодирую URL с помощью 'System. Web.HttpUtility "} ИЛИ / {когда я не выполняю кодирование}

См. Изображение

Есть ли ограничения по 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());
    }
  }
});

1 Ответ

0 голосов
/ 13 июня 2019

Я сталкивался с подобной проблемой, когда работал над Angular с ядром dotnet.

Вы должны удалить этот код из компонента приложения, поскольку этот фрагмент кода создает маркер сброса пароля, сгенерированный ядром dotnet, в нижний регистр и перенаправляет после нижнего регистра

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());
}
  }
});
...