Ошибка: вы указали undefined там, где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable. в моем Auth Interceptor

Я хочу перехватывать каждый запрос к api и проверять код состояния, чтобы он мог отображать сообщение или перенаправлять на определенный компонент, но он дает следующую ошибку:

main.js: 1580 TypeError: Вы указали undefined там, где ожидался поток. Вы можете предоставить> Observable, Promise, Array или Iterable.at subscribeTo (vendor.js: 179688) по адресу subscribeToResult (vendor.js: 179824) по адресу MergeMapSubscriber._innerSub (vendor.js: 175271) по адресу mergeMapSubscriber._torNeNext. js: 175265) в MergeMapSubscriber._next (vendor.js: 175248) в MergeMapSubscriber.next (vendor.js: 170316) в Observable._subscribe (vendor.js: 172287) в Observable._trySubscribe (vendor.2js) в Observable._trySubscribe (vendor.2js) в Observable. .subscribe (vendor.js: 169758) в MergeMapOperator.call (vendor.js: 175233)

Это мой AuthInterceptor:

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { tap } from 'rxjs/operators'; 
import { CommonService } from '../common.service';
import { Router } from '@angular/router';
import { AuthenticationService } from './authentication.service';


@Injectable({
  providedIn: 'root'
})
export class AuthInterceptorService implements HttpInterceptor {

  constructor(
    private common: CommonService,
    private router: Router,
    private auth: AuthenticationService
  ) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (req.headers.get('No-Auth') === 'True') {
      return next.handle(req.clone());
    }
    // To attach header on every request
    if (localStorage.getItem('currentUser') != null) {
      const clonedreq = req.clone({
        headers: req.headers.set('Authorization', 'Bearer ' + localStorage.getItem('currentUser'))
      });
      return next.handle(clonedreq).pipe(tap(
        succ => { },
        err => {
          if (err.status === 401) {
            this.router.navigateByUrl('/login');
          } else if (err.status === 403) {
            this.router.navigateByUrl('/Forbidden');
          } else if (err.status === 400) {
            this.router.navigateByUrl('/error404');
          }
        }
      ));
    } else {
      this.router.navigateByUrl('/login');
    }
  }
}

Я не могу понять, в какой строке или блоке это вызвано, так как это нигде не написано в ошибке. Проект скомпилирован отлично. эта ошибка отображается почти на каждой странице проекта, где отправляется запрос к WEB Api.


person Rishabh Tailor    schedule 24.12.2019    source источник


Ответы (2)


В блоке else отсутствует оператор возврата. Добавить return next.handle(req.clone()); в блок else, если localStorage.getItem('currentUser') равно нулю

person Mukund Sonaiya    schedule 24.12.2019
comment
Вероятно, это связано с тем, что выходные данные вашей веб-службы не возвращают наблюдаемое значение - person Vahid Rahmani; 24.12.2019
comment
Мукунд, ваш ответ удалил ошибку, но он не перехватывает запросы. - person Rishabh Tailor; 26.12.2019

Ришаб, другие действительно связывают эту ошибку с существованием «перехватчиков», это вполне могло быть так. Однако сегодня у меня точно такая же ошибка TypeError. Мое приложение, которое в настоящее время все еще находится в разработке, не использует «перехватчики» (кто знает, может быть, в будущем). Это приложение Angular, в настоящее время обновленное до данных (версия 9.0.2), подключение к API (функции firebase). Я внедрял новые компоненты (crud) 'contractors', на которых я решил использовать 'angular-in-memory-web-api' до хранения данных на бэкэнде.

Как только я реализовал модуль InMemoryWebApiModule.forRoot (ContractorData) в разделе import в App.Module, я заметил, что при извлечении другого объекта я внезапно больше не мог связаться с API, заметившим в консоли браузера:

ОШИБКА TypeError: вы указали undefined там, где ожидался поток. * Вы можете предоставить Observable, Promise, Array или Iterable.

Итак, моя гипотеза: реализация ImMemoryWebApiModule вмешивается (в моем случае) в процесс HttpClient таким образом, что он удаляет или удаляет информацию о запросе, отправленном в api.

См. Снимок экрана  введите здесь описание изображения

Надеюсь, это немного поможет вам разобраться в проблеме!

person KWHJ    schedule 25.02.2020