2017-07-15 52 views
3

我有一個服務來處理與後端交互。我希望捕獲401狀態,表明用戶已被後端註銷(令牌過期)。所以當我抓到401時,我會保存當前的路線,並將它們導航到登錄頁面。但是,當我發現錯誤時,路由器服務未定義。這跟可觀察物有關嗎?角度4可觀察的捕獲服務undefined

@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

通過

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

更換

catch(this.handleError) 

否則,你不是的HandleError功能結合this

另請注意,您的狀態正確的狀態代碼是401,而不是403

+0

你是正確的約401 - 不幸的是有些人對該團隊決定使用403而不是401,並且在評論期間沒有發現。所以兩者都必須處理,然後進行字符串比較......太可怕了。謝謝。我知道這很簡單.. –