2017-07-15 24 views
3

私はバックエンドとのやり取りをするサービスを持っています。ユーザがバックエンドによってログアウトされたことを示す、401状態を捕まえようとしています(トークンの期限切れ)。だから私が401を捕まえたら、現在のルートを保存して、ログインページに移動します。しかし、私がエラーをキャッチすると、ルータサービスは未定義です。これは観察可能なものと関係がありますか?角度4の観測可能なキャッチサービスが定義されていません

@Injectable() 
export class SiteService { 
private url : string = "site"; 
constructor(
    private http: Http, 
    private authService : AuthenticationService, 
    private router : Router, 
    private globals : Globals 
    ){} 

addSite(site : Site) : Observable<Site> { 
    let data = new URLSearchParams(); 
    data.append('auth', this.authService.getToken()); 
    const options = new RequestOptions({ 
     params: data 
    }); 
    return this.http.post(this.url, site, options).map(response => { 
     return toSite(response.json().data); 
    }).catch(this.handleError); 

} 
changeSite(site : Site) : Observable<Site> { 
    let data = new URLSearchParams(); 
    data.append('id', this.authService.getToken()); 
    const options = new RequestOptions({ 
     params: data 
    }); 
    return this.http.post(`${this.url}/${site.siteName}`, site, options).map(response => { 
     return toSite(response.json().data); 
    }).catch(this.handleError); 
} 


private handleError(error : any) { 
    let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); 
    if((error.status == 403 || error.status == 401) &&(error.json().error.indexOf("token") >= 0)){ 
     this.globals.nextLocation = this.router.url; 
     this.router.navigate(['login']); 
    } 
    return Observable.throw(error); 
} 

}

+0

'はconsole.log(エラー)' handleErrorの内側にあることやスクリーンショット – Aravind

答えて

4

そうでない場合、あなたはthisにhandleErrorの機能を結合していない

catch(error => this.handleError(error)) 

によって

catch(this.handleError) 

を交換してください。上、残念ながら一部の人々 -

はまた、あなたの状態のための適切なステータスコードはあなたが401程度正しい401ではなく、403

+0

を更新してしまうことに注意してくださいチームは401の代わりに403を使用することを決め、レビュー中に捕まえられませんでした。だから両方を処理しなければならず、その後の文字列比較...恐ろしい。ありがとう。私はそれが何か単純だったことを知っていた.. –

関連する問題