从服务导航到另一个路由

时间:2017-12-07 22:29:02

标签: nativescript

我有拦截所有Http请求的服务,因此我可以检查用户的令牌是否有效。当Http响应为401时,我希望当前用户退出应用程序:

import { Http, ConnectionBackend, RequestOptions, RequestOptionsArgs, Request, Response } from '@angular/http'
import { Router } from '@angular/router'
import { Observable } from 'rxjs/Observable'
import { Injectable } from '@angular/core'
import { Config } from './shared/config'
import { RouterExtensions } from 'nativescript-angular/router'
import 'rxjs/add/observable/throw'

@Injectable() 
export class RequestInterceptorService extends Http {
    private config: Config = new Config()

    constructor(
        backend: ConnectionBackend, 
        defaultOptions: RequestOptions, 
        private router: Router,
        private routerExtensions: RouterExtensions,
    ) {
        super(backend, defaultOptions)
    }

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
        return this.intercept(super.request(url, options))
    }

    intercept(observable: Observable<Response>): Observable<Response> {
        return observable.catch((err, source) => {
            if (err.status === 401) {
                this.logout()
                return Observable.empty()
            } else {
                return Observable.throw(err)
            }
        })
    }

    logout() {
        this.config.clear()

        this.routerExtensions.navigate(["/signin"], {
            clearHistory: true
        })
    }
}

我的问题是路由器或路由器扩展总是未定义的,因此我无法使用此服务将用户重定向到任何其他路径。

1 个答案:

答案 0 :(得分:0)

所以,我找到了解决方案。这只是了解我正在做的事情的主要内容。

我创建了一个扩展RequestInterceptor模块的Http服务。它包括一个拦截器,用于检查状态代码是否等于401.为了使其与我的项目兼容,我决定将其作为Http的自定义实现提供。 @NgModule上的以下代码就是这样:

providers: [
    {
        provide: Http,
        useClass: RequestInterceptorService
    }
]

RequestInterceptorService事件无法访问Http个依赖关系:ConnectionBackendRequestOptions,因此我必须使用deps属性注入它们,这是一个数组,我可以在其中识别将被注入的依赖项数组。就我而言,我不仅需要注入Http所需的依赖项(XHRBackendRequestOptions),还要注入我的服务将使用的依赖项:RouterExtensions。< / p>

我的providers声明如下:

providers: [
    {
        provide: Http,
        useClass: RequestInterceptorService,
        deps: [XHRBackend, RequestOptions, RouterExtensions]
    }
]

执行此操作后,当从任何请求返回401状态代码时,我能够成功将用户重定向到登录页面。