私はAngular 4を学習してきましたが、サービスでキャッチ処理を実装しようとするまで、すべてが順調に進んでいました。 「rxjs」catch and throwを使用しようとしていますが、コンソールに未定義の関数エラーがあります。
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));
});
}
}
これはエラーメッセージです。
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
私のブラウザにもこの警告があります:
./~/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
エラーThere are multiple modules with names that only differ in casing.
は、Observable
の使用方法で誤ったインポートがターゲットにされていることを示しています。
インポートは次のように大文字の「O」で行う必要があります。
import { Observable } from 'rxjs/Observable';
これにより、個々のObservable
演算子がインポートされ、作成されたObservableでcatch
またはthrow
などの演算子と組み合わせて使用されます。
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
Observableオブジェクト全体をインポートするには、次のようにインポートします。
import { Observable } from 'rxjs/Rx'
うまくいけばそれが助けてくれます!
更新:
RxJSの新しいバージョン(5.5以降)では、map()
やfilter()
などの演算子は、チェーンではなくpipe()
と組み合わせて パイプ可能な演算子 として使用できます。以下のようにインポートされます。
import { filter, map, catchError } from 'rxjs/operators';
throw
などの用語はJavaScriptの予約語/キーワードであるため、RxJS throw
演算子は次のようにインポートされます。
import { _throw } from 'rxjs/observable/throw';
更新:
RxJS(6+)の新しいバージョンでは、これを使用します:
import { throwError } from 'rxjs';
次のようなエラーをスローします。
if (error.status === 404)
return throwError( new NotFoundError(error) )
RxJS 6では、Observable.throw()
がthrowError()
に置き換えられ、その前身と非常によく似た動作をします。したがって、インポートすることで、Observable.throw(error)
からthrowError(error)
のみに置き換えることができます。
import { throwError } from 'rxjs';
詳細については、このリンクを参照してください: https://www.metaltoad.com/blog/angular-6-upgrading-api-calls-rxjs-6
angular 5
アプリケーションでも同じ問題に直面していました。私がしたことは、新しいパッケージを追加することです。
import { throwError } from 'rxjs';
import { filter, map, catchError } from 'rxjs/operators';
そして、http
サービス呼び出しから関数を返します。
return this.http.request(request)
.pipe(map((res: Response) => res.json()),
catchError((res: Response) => this.onError(res)));
そして、onError
関数では、throwError(error)
でエラーを返しています。
onError(res: Response) {
const statusCode = res.status;
const body = res.json();
const error = {
statusCode: statusCode,
error: body.error
};
return throwError(error);
}