#angular #google-chrome #firefox #wait
#угловатый #google-chrome #firefox #подожди #angular #подождите
Вопрос:
Я пытаюсь реализовать аутентификацию FusionAuth на сайте и столкнулся с серьезной проблемой с Chrome и Edge, но не с Firefox. Прямо сейчас, в зависимости от тела ответа, он либо автоматически перенаправит вас на страницу входа в FusionAuth, либо направит вас на домашнюю страницу сайта, которая содержится в панели навигации.
<ng-container *ngIf="this.loggedIn == false; then thenTemplate; else elseTemplate"></ng-container>
<ng-template #thenTemplate>
<meta http-equiv="refresh" content="0; URL=login_url">
</ng-template>
<ng-template #elseTemplate>
<app-navbar></app-navbar>
</ng-template>
Это служба для сбора информации о пользователях. В компоненте, в котором выполняется проверка, проверяется, содержит ли информация адрес электронной почты или нет, поскольку электронная почта требуется для всех пользователей. Если есть электронное письмо, оно устанавливает для свойства «LoggedIn» значение true, в противном случае оно равно false.
export class UserService {
private SERVER_URL = "serverURL";
constructor(private httpClient: HttpClient) { }
handleError(error: HttpErrorResponse) {
let errorMessage = 'Unknown error!';
if (error.error instanceof ErrorEvent) {
errorMessage = `Error: ${error.error.message}`;
} else {
errorMessage = `Error Code: ${error.status}nMessage: ${error.message}`;
}
window.alert(errorMessage);
return throwError(errorMessage);
}
public get() {
return this.httpClient.get(this.SERVER_URL, {withCredentials: true}).pipe(catchError(this.handleError));
}
}
И, наконец, вот проверка. Я полагаю, что проблема возникает здесь:
user: any;
loggedIn: boolean;
constructor(private userService: UserService){}
ngOnInit(): void{
this.userService.get().subscribe((data: any) => {
if(data.email != null){
this.loggedIn = true;
}
else{
this.loggedIn = false;
}
});
}
На данный момент Firefox каким-то образом может дождаться асинхронного запроса, но Chrome отправляет пользователя через бесконечное перенаправление для входа.
По сути, мой вопрос в том, как я могу заставить Angular ждать обработки запроса на обслуживание и продолжать, пока не будет получена вся информация? Я пытался превратить ответ в обещание и вернуться таким образом, но безуспешно.
Спасибо всем!
Комментарии:
1. Я сам не сталкивался с этим, но я думаю, что вы просите разрешить функциональность
2.
httpclient
операции являются управляемыми, что означает, что по умолчанию ничего не происходит до тех пор, пока он не будет подписан и запрос не будет возвращен с успехом или ошибкой. где код, который выполняет фактическое перенаправление? просматривая предоставленный вами пример кода, вашcatcherror
обработчик открывает предупреждение, но я не вижу перенаправления. есть ли у вас перехватчик, который вы используете, который случайно не скопирован здесь?3. Это может помочь dev.to/jwp/observable-to-promise-for-async-await-2d9c
4. @Edward перенаправление происходит в операторе IfThenElse в первой записи кода, мета-тег перенаправляет, ЕСЛИ LoggedIn == false . Интересно, есть ли лучший способ настроить логику в самом компоненте для установки тегов, если у вас есть какие-либо предложения, не стесняйтесь, дайте мне знать.
5. Я не видел, чтобы это делалось в шаблоне. Я ожидал увидеть это в классе. Я попытался воспроизвести проблему только с помощью шаблона и создал stackblitz здесь -> ссылка , но там все работает так, как ожидалось. это заставляет меня спросить, нет ли другого места, где
loggedIn
могло бы быть установлено значение false. Альтернативой было бы обработать перенаправление в классе черезwindow.location.href=
илиwindow.location.replace