ОШИБКА Ошибка: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'length' из неопределенного в Angular 7 и rxjx - PullRequest
0 голосов
/ 15 ноября 2018

Я недавно обновил мое приложение angular 2 до angular 7. Одной из проблем, с которыми я столкнулся, был user.service.ts, где у меня есть метод isAuthentiated.По сути, этот метод передается в auth.guard.ts, чтобы я мог направлять пользователей, если их имени нет в моем списке.

User Service извлекает пользователей, затем isAuthenticated проверяет пользователей.Auth guard проверяет пользователя.Если пользователь находится в списке, предоставьте доступ, в противном случае перейдите на определенный веб-сайт.

user.service.ts

import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { map, catchError, tap } from 'rxjs/operators';
import { HttpClient  } from '@angular/common/http';
import { Observable, of } from 'rxjs';

@Injectable()
export class UserService {
    baseUrl = environment.apiUrl;

    constructor(private http: HttpClient) { }

    private extractData(res: Response) {
        const body = res;
        return body || { };
    }

    ... other methods

    isAuthenticated(): Observable<boolean> {
        return this.http.get(this.baseUrl + 'users').pipe(
            map(this.extractData),
            map(res => !!res.length)
        );
    }
}

И мой auth.guard.ts:

import { UserService } from './../_services/user.service';
import { Injectable } from '@angular/core';
import { CanActivate, RouterStateSnapshot, Router } from '@angular/router';
import { AlertifyService } from '../_services/alertify.service';
import { map } from 'rxjs/operators';


@Injectable()
export class AuthGuard implements CanActivate {

  constructor(
    private userService: UserService,
    private alertifyService: AlertifyService,
    private router: Router
  ) {}

  canActivate(route, state: RouterStateSnapshot) {
    return this.userService.isAuthenticated().pipe(map(user => {
      if (!user) {
        return true;
      } else {
        this.router.navigate(['/authentication/get-jhed']);
        this.alertifyService.error('You need to be authenticated to access this area');
        return false;
      }
    }));
  }
}

Этот код возвращает следующую ошибку:

Ошибка: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'length' с неопределенным

Я пытался res[0].length Я не получил ошибку, но на этот раз ничего не произошло.

Я могу решить эту проблему, используя Http, как показано ниже:

isAuthenticated(): Observable<boolean> {
    return this.http.get(this.baseUrl + 'users').pipe(
        map(res => res.json()),
        map(res => !!res.length)
    );
}

Обратите внимание, что здесь я использую Http, НЕ HttpClient.

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 15 ноября 2018

HttpClient по умолчанию указывает, что тело ответа не является целым объектом ответа.Если вы мигрируете с Http на HttpClient в одно и то же время - для совместимости с предыдущим способом - используйте объект параметров для возврата всего ответа в обратном вызове.

isAuthenticated(): Observable<boolean> {
    return this.http.get(this.baseUrl + 'users', { observe: 'response' }).pipe(
        map(this.extractData),
        map(res => !!res.length)
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...