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

Я получаю эту ошибку, когда пытаюсь выйти из системы.

`core.js:6014 ERROR TypeError: Cannot read property 'length' of undefined
    at http.js:165
    at Array.forEach (<anonymous>)
    at HttpHeaders.lazyInit (http.js:153)
    at HttpHeaders.init (http.js:274)
    at HttpHeaders.forEach (http.js:376)
    at Observable._subscribe (http.js:2342)
    at Observable._trySubscribe (Observable.js:42)
    at Observable.subscribe (Observable.js:28)
    at subscribeTo.js:20
    at subscribeToResult (subscribeToResult.js:7)`

Но когда я отправляю HTTP-запрос от почтальона, код работает. Я успешно вышел из системы, когда использовал почтальон

Мой сервис аутентификации

`logout(user){
    let headers = new HttpHeaders({
      'Content-Type': 'application/json',
      'Authorization': this.token }); //this.token is the value of token(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX...)
  let options = { headers: headers };
    localStorage.clear()
    this.token=null;
    return this.http.post<response>('http://localhost:3000/users/logout',null,options).pipe(map(res=>{
      console.log(res)
       return res
    }))}

`Вот код, где я подписываюсь на этот httpзапрос:

 onLogout(){

    this.authService.logout(this.dataService.storingToken).subscribe(res=>{
      console.log(res)
      if(res.status===true){
      this.router.navigate(["/login"])

 }else{
        console.log("some error has occurred")
      }
    })
  }

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Эта ошибка не из вашего кода (но она вызвана этим).

Ошибка ссылается на строку 165 http.js модуля Angular HttpClient, которая представляет собой следующий фрагмент (по крайней мере, в Angular 8):

        this.lazyInit = (/**
         * @return {?}
         */
        () => {
            this.headers = new Map();
            Object.keys(headers).forEach((/**
             * @param {?} name
             * @return {?}
             */
            name => {
                /** @type {?} */
                let values = headers[name];
                /** @type {?} */
                const key = name.toLowerCase();
                if (typeof values === 'string') {
                    values = [values];
                }
                if (values.length > 0) { // <=== THIS IS WHERE THE ERROR IS ===
                    this.headers.set(key, values);
                    this.maybeSetNormalizedName(name, key);
                }
            }));
        });

Скорее всего, значения заголовков не устанавливаются. Я бы порекомендовал сначала полностью удалить заголовки и посмотреть, исчезнет ли ошибка. Если он исчезнет, ​​добавьте его обратно по одному за раз.

Посмотрите, установлен ли токен на самом деле (что он не является неопределенным). Вы можете добавить console.log (this.token) в начале метода logout ().

Также вам не нужно явно устанавливать Content-Type большую часть времени, так как Angular может занятьЗабота об этом автоматически в большинстве случаев. Вы можете удалить это и посмотреть, имеет ли это какое-то значение.

Тот факт, что вы успешно вышли из системы, вероятно, означает, что вы правильно (явно) передаете заголовки в Postman, но не передаете их правильно в Angular(как указано в ошибке). Кроме того, ваш бэкэнд может просто не выполнять валидацию должным образом. Поэтому тот факт, что вы можете выйти из Почтальона, не имеет существенного отношения к этой проблеме.

0 голосов
/ 23 октября 2019

Я думаю, что заголовки не установлены. Вы можете попробовать установить заголовки таким образом. Создайте свойство headers: any = '' в своем классе

this.headers = new HttpHeaders().set("Content-Type", "application/json") .set("Authorization",this.token)

, а затем используйте их в своем запросе

...