ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable in Angular Services

11,176

Something along these lines:

return this.http.get(url_, options_).pipe(
  map(data => {
    // Transform data here
  }),
  catchError(err => {
    // Handle errors here
  })
);
Share:
11,176
Ehsan Nissar
Author by

Ehsan Nissar

Updated on June 20, 2022

Comments

  • Ehsan Nissar
    Ehsan Nissar almost 2 years

    I have written multiple services to hit different APIs. The services written for post are working somehow but giving this error

    ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. at subscribeTo (subscribeTo.js:27)

    As for the services written for the GET method the same error is shown but i get no data in return. Here is my service

    GetClientData(): Observable<ClientDto> {
        let url_ = this.baseUrl + "https://xxxxxxxxxxxxxxxx/getClients";
        url_ = url_.replace(/[?&]$/, "");
    
        let options_ : any = {
            observe: "response",
            responseType: "blob",
            headers: new HttpHeaders({
                "Accept": "application/json"
            })
        };
    
        return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => {
            return this.processGetAllPermissions(response_);
        })).pipe(_observableCatch((response_: any) => {
            if (response_ instanceof HttpResponseBase) {
                try {
                    return this.processGetAllPermissions(<any>response_);
                } catch (e) {
                    return <Observable<ClientDto>><any>_observableThrow(e);
                }
            } else
                return <Observable<ClientDto>><any>_observableThrow(response_);
        }));
    }
    
    protected processGetAllPermissions(response: HttpResponseBase): Observable<ClientDto> {
        const status = response.status;
        const responseBlob = 
            response instanceof HttpResponse ? response.body : 
            (<any>response).error instanceof Blob ? (<any>response).error : undefined;
    
        let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
        if (status === 200) {
            return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = resultData200 ? ClientDto.fromJS(resultData200) : new ClientDto();
            return _observableOf(result200);
            }));
        } else if (status !== 200 && status !== 204) {
            return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            }));
        }
        return _observableOf<ClientDto>(<any>null);
    }
    

    Cloud Function

    exports.getClients = functions.https.onRequest((req, res) => {
    
        res.set('Access-Control-Allow-Origin', 'http://localhost:4200');
        res.set('Access-Control-Allow-Methods', 'GET', 'POST');
        res.set('Access-Control-Allow-Headers', 'Content-Type');
    
        if (req.method === 'OPTIONS') {
            res.end();
        }
    
        else
        {
    
            let allClients = [];
            usersClients.get()
                .then(snapshot => {
                    snapshot.forEach(doc => {
                        allClients.push(doc.data());
                    });
                    res.send(200, {
                        "data": allClients
                    })
                })
                .catch(err => {
                    console.log("Error getting data", err);
                });
        }
    });
    
  • spierala
    spierala over 4 years
    e.g. catchError(err => EMPTY) to let the stream continue also in case of error
  • Will Alexander
    Will Alexander about 3 years
    I'd say it really depends on the implementation, because sometimes you want to return a specific type/object/value etc. when your request errors out. Doing just that at the moment on a client project, passing on a special string in case of error.