Угловой сервис для получения элементов работает после обновления страницы, но не сразу после входа в систему через aws cognito. - PullRequest
0 голосов
/ 26 января 2019

Я создаю угловое приложение и для аутентификации пытаюсь реализовать AWS cognito.Все работает нормально, за исключением того, что когда я пытаюсь перейти после входа в систему, я попадаю на страницу, где вызывается служба, чтобы получить некоторые элементы.Здесь я получаю сообщение об ошибке «ОШИБКА TypeError: Невозможно прочитать свойство 'message' undefined в CatchSubscriber.selector (error-interceptor.ts: 17)".

Если я обновлю страницу после входа в систему, ошибки не будет.Сообщение свойства, вероятно, получено из метода getCars (), где я устанавливаю ожидаемый тип возврата из запроса Get HTPP.Я подписываюсь на метод, потому что у меня есть предмет, который поменял автомобили, который должен сказать другим частям, которые я назвал этим методом.Я получил это из учебника.Я также попытался изменить его, чтобы я не подписывался на сервис, но я возвращал наблюдаемое, не работало.

Я не совсем понимаю, что здесь происходит, я отсканировал Google и переполнение стека, узнал немного больше о наблюдаемых, но не смог найти ничего, что решило бы ошибку.Кто-нибудь может мне помочь здесь?

Версия угловая 6

Код службы аутентификации:

private session: CognitoUserSession;
private isAuthenticated = false;
private token: string;
private tokenTimer: any;
private authStatusListener = new Subject<boolean>();

signIn(email: string, password: string){
var userData = {
        Username : email, 
        Pool : this.userPool
    };
    var authenticationData = {
        Username : email, 
        Password : password, 
    };


    var authenticationDetails = new AuthenticationDetails(authenticationData);
    var cognitoUser = new CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess:  (result: any) => {
            this.saveToken(result);
        },
        onFailure:(err: any) => {
            console.log(err);
            if(err.message){
                alert(err.message);
            }
            this.authStatusListener.next(false);
        },
        mfaRequired: (codeDeliveryDetails: any) => {
            var verificationCode = prompt('Please input verification code' ,'');
            cognitoUser.sendMFACode(verificationCode, {
                onSuccess:  (result: any) => {
                    this.saveToken(result);
                },
                onFailure:(err: any) => {
                    console.log(err);
                    if(err.message){
                        alert(err.message);
                    }
                    this.authStatusListener.next(false);
                }
            });
        }
    });

}


saveToken(result: any){
    this.session = result;
    var accessToken = result.getAccessToken().getJwtToken();
    const expiresInDuration = 3600;
    this.setAuthenticateTimer(expiresInDuration);
    this.isAuthenticated = true;
    this.authStatusListener.next(true);
    const now = new Date();
    const expirationDate = new Date(now.getTime() + expiresInDuration * 1000);
    this.saveAuthenticatedData(accessToken, expirationDate);
    this.router.navigate(['/']);
}

Служба автомобилей:

carsChanged = new Subject<Car[]>();

private cars: Car[] = [];

constructor(private http: HttpClient, private router: Router) {}

  getCars() {
      this.http
      .get<{message: string, cars: any}>(
        BACKEND_URL)
      .pipe(map((carData) => {
        return carData.cars.map(car => {
            return {
                id: car._id,
                brand: car.brand,
                series: car.series,
                infoDescription: car.infoDescription,
                infoCommon: car.infoCommon,
                priceNew: car.priceNew,
                price: car.price,
                advantage: car.advantage,
                BTWRegime: car.BTWRegime,
                infoFiscal: car.infoFiscal,
                BIV: car.BIV,
                roadTax: car.roadTax,
                trumps: car.trumps,
                options: car.options,
                imagePaths: car.imagePaths
            }
        });
      }))
      .subscribe((transformedCars) =>{
        this.cars = transformedCars;
        this.carsChanged.next([...this.cars]);
      });
  }

Как я называю логин:

onSignIn(form: NgForm) {
if(form.invalid) {
  return;
}

this.isLoading = true;

const email = form.value.email;
const password = form.value.password;
this.authService.signIn(email, password)

}

Как я вызываю автосервис:

cars: Car[] = [];
private subscription: Subscription;
isLoadingList = false;

constructor(private carService: CarService, private router: Router, 
private route: ActivatedRoute) { }

ngOnInit() {

this.isLoadingList = true;
this.carService.getCars();
this.subscription = this.carService.carsChanged
.subscribe(
  (cars: Car[]) => {
    this.isLoadingList = false;
    this.cars = cars;
  }
);

}

Ошибка (только сразу после входа в систему, когда я обновляюсь после входа в систему, она работает нормально):

core.js: 1673 ОШИБКА TypeError: Невозможно прочитать свойство 'message' undefined в CatchSubscriber.selector (error-interceptor.ts: 17) в CatchSubscriber.push ../ node_modules / rxjs / _esm5 / internal /operator / catchError.js.CatchSubscriber.error (catchError.js: 34) в Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable._trySubscribe (Observable.js: 49) в Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js: 28) в CatchOperator.push ../ node_modules / rxjs / _esm5 / internal / operator / catchError.js.CatchOperator.call (catchError).js: 18) at Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable.subscribe (Observable.js: 23) на subscribeTo.js.MergeMapSubscriber._innerSub (mergeMap.js: 73) в MergeMapSubscriber.push ../ node_modules / rxjs / _esm5 / internal / operator / mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js: 68)

10 в 10 * 10 * 10 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...