簡體   English   中英

類型錯誤:您提供了一個預期流的無效對象。 你可以提供一個 Observable、Promise、Array 或 Iterable

[英]TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable

我正在嘗試從服務調用進行map ,但出現錯誤。 subscribe 是不是在 angular 2 中定義的? 它說為了訂閱我們需要從運營商內部返回。 我也有退貨聲明。

這是我的代碼:

checkLogin(): Observable<boolean> {
  return this.service
    .getData()
    .map(
      (response) => {
        this.data = response;
        this.checkservice = true;
        return true;
      },
      (error) => {
        // debugger;
        this.router.navigate(["newpage"]);
        console.log(error);
        return false;
      }
    )
    .catch((e) => {
      return e;
    });
}

錯誤日志:

類型錯誤:您提供了一個預期流的無效對象。 你可以提供一個 Observable、Promise、Array 或 Iterable

在我的情況下,錯誤僅在 e2e 測試期間發生。 這是由我的 AuthenticationInterceptor 中的throwError引起的。

我從錯誤的來源導入它,因為我使用了 WebStorm 的導入功能。 我正在使用 RxJS 6.2。

錯誤的:

import { throwError } from 'rxjs/internal/observable/throwError';

正確的:

import { throwError } from 'rxjs';

這里是攔截器的完整代碼:

import { Injectable } from '@angular/core';
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

@Injectable()
export class AuthenticationInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const reqWithCredentials = req.clone({withCredentials: true});
    return next.handle(reqWithCredentials)
     .pipe(
        catchError(error => {
          if (error.status === 401 || error.status === 403) {
            // handle error
          }
          return throwError(error);
        })
     );
  }
}

在您的示例代碼中,您的map操作員接收了兩個回調,而它應該只接收一個回調。 您可以將錯誤處理代碼移至 catch 回調。

checkLogin():Observable<boolean>{
    return this.service.getData()
                       .map(response => {  
                          this.data = response;                            
                          this.checkservice=true;
                          return true;
                       })
                       .catch(error => {
                          this.router.navigate(['newpage']);
                          console.log(error);
                          return Observable.throw(error);
                       })
   }

您還需要導入catchthrow運算符。

import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

編輯:請注意,通過在 catch 處理程序中返回Observable.throw ,您實際上不會捕獲錯誤 - 它仍然會出現在控制台上。

如果您的函數期望返回布爾值,請執行以下操作:

  1. 進口:
import { of, Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
  1. 然后
checkLogin(): Observable<boolean> {
  return this.service.getData()
    .pipe(
      map(response => {
        this.data = response;
        this.checkservice = true;
        return true;
      }),
      catchError(error => {
        this.router.navigate(['newpage']);
        console.log(error);
        return of(false);
      })
)}

您正在返回一個 Observable,而您的代碼僅返回一個布爾值。 所以你需要使用如下

.map(response => <boolean>response.json())

如果你在你的情況下使用另一個公共服務checkservice服務,你可以簡單地使用

this.service.getData().subscribe(data=>console.log(data));

這將使您的checkLogin()函數的返回類型為 void

 checkLogin():void{
      this.service.getData()
            .map(response => {  
                           this.data = response;                            
                           this.checkservice=true;
             }).subscribe(data=>{ });

你可以使用this.checkService來檢查你的情況

我忘記返回pipe(switchMap(的另一個可觀察對象pipe(switchMap(

this.dataService.getPerson(personId).pipe(
  switchMap(person => {
     //this.dataService.getCompany(person.companyId); // return missing
     return this.dataService.getCompany(person.companyId);
  })
)

可以由 RxJS pipe(...)的雜散逗號 ( , ) 觸發pipe(...)

編譯不會在最后捕獲這個額外的逗號:

pipe(first(), map(result => ({ event: 'completed', result: result}),);

它變成了一個“不可見”的undefined運算符,它將整個管道擰緊,並導致非常混亂的錯誤消息 - 在這種情況下與我的實際邏輯無關。

我有同樣的問題,因為導入了“takeUntil”的內部版本而不是操作符 Change

import { takeUntil } from 'rxjs/internal/operators/takeUntil';

import { takeUntil } from 'rxjs/operators';

這也發生在其他運營商身上

我在嘗試使用 JSON Web Token 對用戶進行身份驗證時遇到了這個問題。 就我而言,它與身份驗證攔截器有關。

發送對用戶進行身份驗證的請求不必提供令牌,因為它尚不存在。

檢查您的攔截器是否包含以下內容:

if (req.headers.get('No-Auth') == "True")
            return next.handle(req.clone());

並且您向標頭的請求提供{'No-Auth':'True'} ,如下所示:

  authenticateUser(user): Observable<any> {
    const headers = new HttpHeaders({'No-Auth':'True'});
    headers.append('Content-Type', 'application/json');
    return this.httpClient.post(`${this.apiEndpoint}/auth/authenticate`, user, {headers: headers});
  }

給任何遇到這種情況的人的提示。 switchMap沒有收到可觀察的返回值(如null )時,就會發生這種情況。 簡單地添加一個默認情況,所以它總是返回一個可觀察的。

        switchMap((dateRange) => {
          if (dateRange === 'Last 24 hours') {
            return $observable1;
          }
          if (dateRange === 'Last 7 Days') {
            return $observable2;
          }
          if (dateRange === 'Last 30 Days') {
            return $observable3;
          }
          // This line will work for default cases
          return $observableElse;
        })

我寫這篇文章是因為我來到這里尋找相同的錯誤,這可能對將來的某個人有用。

我在嘗試從其構造函數初始化服務變量時遇到相同的錯誤,通過 http.get 和.subscribe()調用遠程 API

經過多次測試但不知道問題出在哪里,我終於明白了:我的應用程序具有身份驗證和HttpInterceptor ,並且我嘗試使用http.get(...)初始化調用公共 API 方法的服務,而沒有“No-Auth” '標題。 我在這里添加了它們,問題為我解決了:

getData() {
var reqHeader = new HttpHeaders({ 'Content-Type': 'application/x-www-urlencoded','No-Auth':'True' });    
return this.http.get(environment.urlApi.Literales, { headers: reqHeader });  
}

好頭疼:(

就我在 Angular-5 中的情況而言,沒有導入服務文件,我正在訪問該方法並訂閱數據。導入服務文件后,它工作正常。

當我使用攔截器時,我發生了這個錯誤,您必須在攔截器中執行此操作

return next.handle(request).map(event => {
        if (event instanceof HttpResponse) {

        }
        return event;
    },
      catchError((error: HttpErrorResponse) => {
        if (error.status === 401 || error.status === 400) {
          // some logic

        }

這個錯誤發生在我身上@angular 7

您在需要流的地方提供了一個無效的對象。 您可以提供 Observable、Promise、Array 或 Iterable。

該錯誤實際上是不言自明的,它說在 observable 的somewhere我傳遞了無效對象。 就我而言,有很多 API 調用,但由於服務器配置錯誤,所有調用都失敗了。 我嘗試使用mapswitchMap或其他 rxjs 運算符,但這些運算符正在獲取未定義的對象。

因此,請仔細檢查您的 rxjs 操作員輸入。

當我在 switchMap 內部調用方法時,我也面臨同樣的問題,顯然我發現如果我們在 switchMap 內部使用方法,它必須返回可觀察的。

我使用管道返回 observable 並映射以在管道內執行操作以進行 api 調用,這是我在方法內部執行而不是訂閱它。

當跨項目存在不同的 RxJS 版本時,我遇到了這個錯誤。 RxJS 中的內部檢查失敗,因為有幾個不同的Symbol_observable 最終這個函數拋出一次從像switchMap這樣的扁平操作符switchMap

嘗試在某個入口點導入符號可觀察。

// main index.ts
import 'symbol-observable';

我不確定這是否會對任何人有所幫助,但在我的情況下,我使用了distinctUntilChanged並且在函數內部出現了一個異常,並顯示了此錯誤消息。

當您向需要 Observable的運算符提供 undefined 左右時,您也會收到以下錯誤消息,例如。 直到.

TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable 

就我而言,我錯誤地將 Action 導入到我的 combineEpics 中,而不是 Epic 中...

驗證組合史詩中的所有函數都是史詩函數

我在 NESTJS 中使用 RXJS 時遇到了類似的錯誤。

Error: TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. +1ms

就我而言,我忘記在 switchMap 中返回一個 Observable。 這導致在下一個 RXJS 操作符或客戶端代碼中沒有收到 Observable。

一旦我在 switchMap 中返回了一個 Observable,錯誤就消失了。

在進行單元測試並在模擬我的服務后拋出可觀察到的異常時,我有相同的錯誤消息。

我通過在Observable.throw傳遞精確的函數和格式來解決它。

調用服務並subscribe以獲取數據的實際代碼。 注意catch來處理400錯誤。

     this.search(event).catch((e: Response) => {
        if (e.status === 400) {
          console.log(e.json().message);
        } else if (e.url) {
          console.log('HTTP Error: ' + e.status + ' ' + e.statusText,
            'URL: ' + e.url, 'Info: ' + e.json().message));
        }
      }).finally(() => {
        this.loading = false;
      }).subscribe((bData) => {
        this.data = bData;
      });

服務內的代碼

  search() {
    return this.someService.getData(request)
       .do((r) => {
          this.someService.defaultHeaders.delete('skipAlert');
          return r;
        })
      .map((r) => {
          return r.businessObjectDataElements.length && r.businessObjectDataElements || null;
        });
  }

單元測試

我已經模擬了 SomeService 並返回了可觀察的數據,它很好,因為它里面有所有必需的方法。

 someServiceApi = fixture.debugElement.injector.get(SomeService);
 spyOn(someServiceApi, 'getData').and.returnValue(Observable.of({}));

上面的代碼很好,但是當我嘗試通過傳遞Observable.throw({})來測試捕獲/錯誤條件時,它向我顯示了錯誤,因為它期望從服務返回Response類型。

所以下面的服務模擬返回給了我那個錯誤。

someServiceApi.getData
  .and.returnValue(Observable.throw(new Response({status: 400, body: [], message: 'not found error'})));

所以我通過在我的返回對象中復制確切的預期函數而不是傳遞一個Response類型值來糾正它。

someServiceApi.getData
  .and.returnValue(Observable.throw({status: 400, json: () => { return {message: 'not found error'}}, body: []}));
// see `json: () => { return {message: 'not found error'}}` inside return value

關於“您在需要流的地方提供了無效對象。您可以提供 Observable、Promise、Array 或 Iterable”錯誤。

如果您(下面)某個模塊/函數/任何實際使用它的模塊/函數/任何東西之后import { Observable } from 'rxjs'就會發生這種情況。

解決方案:將此導入移動到該模塊的導入上方

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 Angular:您在需要流的地方提供了一個無效的對象。 你可以提供一個 Observable、Promise、Array 或 Iterable xplat您提供了一個無效的對象,該對象應在其中流。 您可以提供一個Observable,Promise,Array或Iterable 類型錯誤:您在需要流的地方提供了“未定義”。 你可以提供一個 Observable、Promise、Array 或 Iterable 錯誤類型錯誤:您在需要流的地方提供了“空”。 你可以提供一個 Observable、Promise、Array 或 Iterable Angular 11 錯誤:您提供了無效的 object,而應為 stream。 您可以提供一個 Observable、Promise、Array 或 Iterable TypeError:您在需要 stream 的地方提供了“未定義”。 部署angular時可以提供Observable、Promise、Array或Iterable Angular5:TypeError:您提供了&#39;undefined&#39;,其中包含一個流。 您可以提供Observable,Promise,Array或Iterable TypeError:您在預期 stream 的地方提供了“未定義”。 您可以提供 Observable、Promise、Array 或 Iterable。 在<jasmine></jasmine> @ngrx / effects給出了TypeError:你提供了&#39;undefined&#39;來預期流。 您可以提供Observable,Promise,Array或Iterable 錯誤類型錯誤:您在需要流的地方提供了“未定義”。 您可以在 Angular 服務中提供 Observable、Promise、Array 或 Iterable
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM