2016-12-13 71 views
0

的路徑。我正在使用Angular2服務發出HTTP請求到一個RESTful API服務器。我需要捕捉401錯誤並將用戶重定向到/登錄頁面。出於某種原因,router.nagivate(['/ login'])不會在下面的代碼中執行。請注意,我已按照此答案中的說明Angular 2 redirect in http/rxjs catch callback causes TypeError: Cannot read property 'subscribe' of undefined,但我的代碼不重定向。Angular2導航到基於HTTP 401錯誤

search(term: string): Observable<[]> { 
return this.http 
    .get(this.userListUrl+'User?name='+term') 
    .map((r: Response) => r.json()) 
    .catch(this.handleError); 

}

private handleError(error: any): Observable<any>{ 
if(error.status == 401) { 
    console.error('An error occurred', error.status); 
    this.router.navigate(['/login']); 
    return Observable.of([]); 
} else { 
    let errMsg = error.statusText || 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Observable.throw(errMsg); 
}} 

constructor(private http: Http, private router:Router) {} 

編輯:更新handlerError代碼。 UIRouter並呼籲the go method

+0

是否得到記錄錯誤從你的'handleError'功能安慰? – Brad

+0

是的。它是401. – kkotak

回答

0

在UI的路由器NG2(import { UIRouter } from 'ui-router-ng2';),您可以通過注入路由器編程導航router.stateService.go('somestate')

爲例

app.routing.ts

export const ROUTES: any = [ 
    {url: '/login',    name: 'Login',  component: LoginComponent} 
] 

那麼你函數應該是:

if(error.status == 401) { 
    this.router.stateService.go('Login'); 
} 

router

private router:  UIRouter; 
Constructor

+0

謝謝@ 53l3m。我希望有一個原生的Angular2做這件事的方式,特別是因爲我提到的鏈接中的用戶成功地使用了與我一樣的代碼進行路由。 – kkotak

+0

它不需要任何東西,只需要從'ui-router-ng2'導入{UIRouter},而不是'import {Router}'。 ' ',這是一個大問題? –

+1

對不起@ 53l3m,我不是故意冒犯你,但是我正在尋求解決這個問題,而不需要在我的代碼中添加新的模塊,並修復我在這裏做的錯誤。 – kkotak