Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度4:can';不能从订阅服务器内部重定向_Javascript_Angular_Angular Router - Fatal编程技术网

Javascript 角度4:can';不能从订阅服务器内部重定向

Javascript 角度4:can';不能从订阅服务器内部重定向,javascript,angular,angular-router,Javascript,Angular,Angular Router,在多次尝试失败后,我仍然无法从订阅内部实现重定向 我想捕获错误代码401,将用户重定向到登录页面,因此在http.get.subscribe中,如果我有错误,如果是401,我将执行goLogin()。 此函数必须告诉路由器导航到登录页面,但它没有。除了路由,一切都正常 这是我的密码: import { Http } from '@angular/http'; import { Injectable, NgZone } from '@angular/core'; import { Categor

在多次尝试失败后,我仍然无法从订阅内部实现重定向

我想捕获错误代码401,将用户重定向到登录页面,因此在
http.get.subscribe
中,如果我有错误,如果是401,我将执行
goLogin()
。 此函数必须告诉路由器导航到登录页面,但它没有。除了路由,一切都正常

这是我的密码:

import { Http } from '@angular/http';
import { Injectable, NgZone } from '@angular/core';

import { CategoryFactory } from  "./../factory/category.factory";
import { StatusFactory } from  "./../factory/status.factory";
import { TicketFactory } from  "./../factory/ticket.factory";

import { HeaderProvider } from  "./../provider/header.provider";

import { Router, ActivatedRoute } from '@angular/router';

@Injectable()
export class TicketService {

    public liste: TicketFactory[] = [];

    constructor(private http: Http, private requestoptions:HeaderProvider, private _router:Router, private r:ActivatedRoute, private zone: NgZone) {

        this.http.get('/issue', this.requestoptions.options)
        .map(
            res => res.json(),
            err => err.json()
        )
        .subscribe(
            (liste:any) => {
                liste.forEach((l) => {
                    let t = new TicketFactory(
                        l.id,
                        l.title,
                        l.author,
                        l.text,
                        l.email,
                        new CategoryFactory(l.category.id, l.category.label),
                        new StatusFactory(l.status.id, l.status.label),
                        l.createdat,
                        l.priority,
                        l.sendto
                    );

                    this.liste.push(t);
                })
            },
            (err:any) => {
                if(err.json().code === 401) {
                    this.goLogin();
                }
            },
        )
    }

    goLogin = (): void  => {

        this.zone.run(() => { console.log('go login'); this._router.navigate(['login']) })
    }

    getList = () : TicketFactory[] => {
        return this.liste;
    }

    getTicket = (idticket):any => {
        return this.http.get('/issue/' + idticket, this.requestoptions.options).map(res => res.json());
    }

    deleteTicket = (idticket):any => {
        return this.http.delete('/issue/' + idticket, this.requestoptions.options)
            .toPromise()
            .then()
            .catch();
    }
}
下面是
app.routes.ts

import { Routes }                       from '@angular/router';

import { FormComponent }                from './components/form/form.component';
import { LoginComponent }               from './components/login/login.component';
import { SigninComponent }              from './components/signin/signin.component';
import { TicketComponent }              from './components/ticket/ticket.component';
import { TicketListComponent }          from './components/ticketslist/ticketlist.component';

import { OnlyLoggedInUsersGuard }       from './components/guard/guard.component';

export const appRoutes: Routes = [
    {
        path: 'signin',
        component: SigninComponent,
        canActivate: [OnlyLoggedInUsersGuard]
    },
    {
        path: 'tickets/:id',
        component: TicketComponent,
        canActivate: [OnlyLoggedInUsersGuard]
    },
    {
        path: 'tickets',
        component: TicketListComponent,
        canActivate: [OnlyLoggedInUsersGuard]
    },
    {
        path: 'login',
        component: LoginComponent
    },
    {
        path: '',
        component: FormComponent
    },
    {
        path: '**',
        redirectTo: ''
    }
]
它进入
goLogin()
console.log(…)
被执行,但它不会重定向到登录页面

以下是控制台输出(如果有帮助):

14:36:07.962 zone.js:2263 GET http://localhost:4200/user 401 (Unauthorized)
14:36:08.036 core.es5.js:1020 ERROR Response {_body: "{"code":401,"message":"Invalid authentication token"}", status: 401, ok: false, statusText: "Unauthorized", headers: Headers…}
14:36:08.048 zone.js:2263 GET http://localhost:4200/category 401 (Unauthorized)
14:36:08.110 core.es5.js:1020 ERROR Response {_body: "{"code":401,"message":"Invalid authentication token"}", status: 401, ok: false, statusText: "Unauthorized", headers: Headers…}
14:36:08.116 zone.js:2263 GET http://localhost:4200/issue 401 (Unauthorized)
14:36:08.122 ticket.service.ts:53 go login
14:36:08.479 zone.js:2263 GET http://localhost:4200/status 401 (Unauthorized)
14:36:08.575 core.es5.js:1020 ERROR Response {_body: "{"code":401,"message":"Invalid authentication token"}", status: 401, ok: false, statusText: "Unauthorized", headers: Headers…}

您应该删除
this.zone.run(…)
,因为它不是必需的。应用程序应保持在角度范围内。您还需要路线前方的
/

尝试交换:

goLogin = (): void  => {
    this.zone.run(() => { console.log('go login'); this._router.navigate(['login']) })
}
对下列事项:

goLogin = (): void  => {
    console.log('go login');
    this._router.navigate(['/login']) })
}

控制台中有错误吗?看起来是正确的,您是否尝试将“/”放在“登录”之前?
.map(res=>res.json(),err=>err.json())
?您是否尝试在错误处理程序中记录错误?控制台中没有错误。使用“/”不会发生任何更改。我试过了,但我没有帮我。请你也用
这个来发布routes.ts?好吗?\u router.navigateByUrl('login')
它仍然不起任何作用。this.router.navigateByUrl('/login');虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
goLogin = (): void  => {
    console.log('go login');
    this._router.navigate(['/login']) })
}