Angular: TypeError: Невозможно прочитать свойство 'length' с нулевым значением при подписке () - PullRequest
0 голосов
/ 15 ноября 2018

Я получаю этот ответ при отправке HTTP-запроса в сервисе:

TypeError: Cannot read property 'length' of null
    at eval (http.js:123)
    at Array.forEach (<anonymous>)
    at HttpHeaders.lazyInit (http.js:117)
    at HttpHeaders.init (http.js:265)
    at HttpHeaders.forEach (http.js:368)
    at Observable.eval [as _subscribe] (http.js:2172)
    at Observable.subscribe (Observable.js:162)
    at eval (subscribeToObservable.js:16)
    at subscribeToResult (subscribeToResult.js:6)
    at MergeMapSubscriber._innerSub (mergeMap.js:127)
ALERT!!!!! 

Я подписываюсь на HTTP-запрос при загрузке моего компонента:

export class TasksComponent implements OnInit {
  currentUser:any;
  username:string=null;
  constructor(private usersService:UsersService) {}
  ngOnInit() {
    this.username=localStorage.getItem('currentUsername');
    console.log(this.username);
    this.usersService.getUserByUsername(this.username)
      .subscribe(data=>{
        console.log(data);
        this.currentUser=data;
      },err=>{
        console.log(err);
        console.log("ALERT!!!!! ");
      })
  }
}

UsersService:

//for getting a user by its username
getUserByUsername(username:string){
  if(this.jwtToken==null) this.authenticationService.loadToken();
    return this.http.get(this.host+"/userByUsername?username="+username
          , {headers:new HttpHeaders({'Authorization':this.jwtToken})}
    );
}

Как я сохранил имя пользователя в localStorage, чтобы я мог использовать его для поиска пользователя со всеми его свойствами:

@Injectable()
export class AuthenticationService {
  private host:string="http://localhost:8080";
  constructor(private http:HttpClient){}
  login(user){
    localStorage.setItem('currentUsername', user.username);
    return this.http.post(this.host+"/login",user, {observe:'response'});
  }
}

My localStorage после входа в систему

Знание того, что метод работает в бэкэнде, как в на этом рисунке в чем проблема?это проблема с внедрением службы, или она связана с зависимостями или чем-то другим?

EDIT Функция loadToken:

loadToken(){
    this.jwtToken=localStorage.getItem('token');
    console.log(this.jwtToken);
    let jwtHelper=new JwtHelper();
    this.roles=jwtHelper.decodeToken(this.jwtToken).roles;
    return this.jwtToken;
}

1 Ответ

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

, так как вы не видите запрос на сетевой панели вашего браузера, кажется, что вы не отправляете запрос. Вероятно, это потому, что вы не установили токен в этой строке:

if(this.jwtToken==null) this.authenticationService.loadToken();

ошибка:

TypeError: Cannot read property 'length' of null
    at eval (http.js:123)
    at Array.forEach (<anonymous>)
    at HttpHeaders.lazyInit (http.js:117)
    at HttpHeaders.init (http.js:265)
    at HttpHeaders.forEach (http.js:368)

указывает, что ваш заголовок (Authorization) равен null и поэтому не может быть прочитан.

попробуйте изменить строку на:

if(this.jwtToken==null) this.jwtToken = this.authenticationService.loadToken();

теперь вы должны увидеть свой запрос на сетевой панели

или, может быть, вы просто хотите проверить токен на самом authenticationService:

if(this.authenticationService.jwtToken==null) this.authenticationService.loadToken();
    return this.http.get(this.host+"/userByUsername?username="+username
      , {headers:new HttpHeaders({'Authorization':this.authenticationService.jwtToken})}
);
...