I've been learning Angular 4 and everything was going smoothly until I tried to implement catch handling in a service. I'm trying to use "rxjs" catch and throw but I've got an undefined function error in my console.
import { Injectable } from '@angular/core';
import { Http } from "@angular/http";
import { Observable } from 'rxjs/observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import { AppError } from "../app/common/app.error";
import { NotFoundError } from "../app/common/not-found-error";
import { BadInput } from "../app/common/bad-input";
@Injectable()
export class PostService {
private url = "https://jsonplaceholder.typicode.com/posts";
constructor(private http: Http) { }
deletepost(post){
// return this.http.delete(this.url + '/' + post.id)
// Hard-coded id to test 404
return this.http.delete(this.url + '/' + 93498)
.catch((error: Response) => {
console.log('error within catch is ' + Response)
if(error.status === 404)
return Observable.throw(new NotFoundError(error));
return Observable.throw(new AppError(error));
});
}
}
This is the error message:
TypeError: __WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw is not a function.
(In '__WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw(new
__WEBPACK_IMPORTED_MODULE_6__app_common_not_found_error__["a" /* NotFoundError
*/](error))',
'__WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw' is
undefined) — post.service.ts:42
I also have this warning in my browser:
./~/rxjs/Observable.js
There are multiple modules with names that only differ in casing.
This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.
Use equal casing. Compare these module identifiers:
* /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/rxjs/Observable.js
Used by 14 module(s), i. e.
/Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/@angular/core/@angular/core.es5.js
* /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/rxjs/observable.js
Used by 1 module(s), i. e.
/Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/@ngtools/webpack/src/index.js!/Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/src/services/post.service.ts
In RxJS 6,
Observable.throw()
is replaced bythrowError()
which operates very similarly to its predecessor. So, you can replace fromObservable.throw(error)
to onlythrowError(error)
by importing:Checkout this link for further reference: https://www.metaltoad.com/blog/angular-6-upgrading-api-calls-rxjs-6
The error
There are multiple modules with names that only differ in casing.
is indicating the wrong import is being targeted with how you are trying to useObservable
.The import should be with a capital "O" like:
import { Observable } from 'rxjs/Observable';
This will import the individual
Observable
operator, which be used in combination with operators such ascatch
orthrow
on created Observables.To import the full Observable object you'd import it like this:
import { Observable } from 'rxjs/Rx'
Hopefully that helps!
Update:
With newer versions of RxJS (5.5+) operators such as
map()
andfilter()
can used as pipeable operators in combination withpipe()
rather than chaining. They are imported such as:Keep in mind terms such as
throw
are reserved/key words in JavaScript so the RxJSthrow
operator is imported as:Update:
For newer versions of RxJS (6+), use this:
and throw an error like this:
I was facing the same issue in my
angular 5
application. What I did is, adding a new package.And from my
http
service call I return a function.And in
onError
function I am returning the error withthrowError(error)
._throw has been discarded in newer versions of RxJS
For newer versions of RxJS (6+), use this:
and throw an error like this: