![](/img/trans.png)
[英]Angular: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or 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);
})
}
您還需要導入catch
和throw
運算符。
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
編輯:請注意,通過在 catch 處理程序中返回Observable.throw
,您實際上不會捕獲錯誤 - 它仍然會出現在控制台上。
如果您的函數期望返回布爾值,請執行以下操作:
import { of, Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
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);
})
)
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 調用,但由於服務器配置錯誤,所有調用都失敗了。 我嘗試使用map
、 switchMap
或其他 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.