使用HTTP服务的Angular2延迟加载

使用HTTP服务的Angular2延迟加载,angular,lazy-loading,angular-http,Angular,Lazy Loading,Angular Http,我有一个延迟加载的Auth模块(一个实验),它正在加载文件。此Auth模块引用AuthService,该AuthService也可以正常加载。然而,@angular/http引用并不正确 如果我在开发模式下加载应用程序,那么延迟加载就是急切加载,我可以输出http注入引用并获得 Http{{u后端:XHRBackend,{u defaultOptions:BaseRequestOptions} 然后,在prod模式下运行时,在真正的延迟加载下,该引用读取 t{u backend:t,{u

我有一个延迟加载的Auth模块(一个实验),它正在加载文件。此Auth模块引用AuthService,该AuthService也可以正常加载。然而,
@angular/http
引用并不正确

如果我在开发模式下加载应用程序,那么延迟加载就是急切加载,我可以输出http注入引用并获得


Http{{u后端:XHRBackend,{u defaultOptions:BaseRequestOptions}

然后,在prod模式下运行时,在真正的延迟加载下,该引用读取


t{u backend:t,{u defaultOptions:e}

所以,我知道它正在加载,但被弄糊涂了。那很好。服务模块如下所示:

```

从'@angular/core'导入{Injectable,injection};
从'@ngrx/Store'导入{Store};
从'@angular/Http'导入{Http,Response,Headers,RequestOptions};
从“rxjs”导入{Observable};
从“../models/User.model”导入{User};
从“../actions/auth.action”导入*作为身份验证;
从“../util”导入*作为utils;
@可注射()
导出类身份验证服务{
公共令牌:字符串;
公共用户:用户;
建造师(
私家店,
专用http:http){
var currentUser=JSON.parse(localStorage.getItem('currentUser');
如果(当前用户){
this.token=currentUser.token;
this.user=currentUser.user;
this.store.dispatch(新的auth.LoginAction({user:this.user,token:this.token,isLoggedIn:true}));
}
}
登录(电子邮件、密码){
let options=newrequestoptions({headers:utils.getHeaders()});
返回此.http.post(`${utils.hostname()}auth/callback`,
stringify({email,password}),选项)
.map((响应:响应)=>{
//如果响应中有jwt令牌,则登录成功
让resp=response.json();
让token=resp&&resp.jwt;
让user=resp&&resp.user;
if(令牌和用户和响应成功){
//设置令牌属性
this.token=token;
this.user=用户;
//将用户名和jwt令牌存储在本地存储中,以在页面刷新之间保持用户登录
//localStorage.setItem('currentUser',
stringify({user,token}));
//返回true表示成功登录
this.store.dispatch(新的auth.LoginAction({token,user,isLoggedIn:true}));
返回true;
}否则如果(相应错误){
返回相应的错误;
}否则{
//返回false表示登录失败
返回false;
}
})
.catch((error:any)=>Observable.throw((error)?error.json().error:'Server error');
}
}
```

现在,在dev中调用login就可以了。然而,在prod中,post从不发生,而是调用catch,并且不传递任何参数。因此,我只是将“服务器错误”视为输出

虽然捕获从未传递任何内容,但如果我移除捕获,我将进入控制台:


结果:TypeError:this.removeAttribute不是XMLHttpRequest.n.get[作为onreadystatechange]的函数
(vendor.cc0ce10…bundle.js:814)位于XMLHttpRequest.send(vendor.cc0ce10…bundle.js:478)

有人知道我错过了什么吗?为什么
@angular/http
不能在prod模式下工作


谢谢

所以,问题出在Zone.js上,因为我使用了Raven.js,如本文所述

import { Injectable, Inject } from '@angular/core';
import { Store } from '@ngrx/store';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs';

import { User } from '../models/user.model';

import * as auth from '../actions/auth.action';
import * as utils from '../util';

@Injectable()
export class AuthService {
    public token: string;
    public user: User;

    constructor(
        private store: Store<User>,
        private http: Http) {
        var currentUser = JSON.parse(localStorage.getItem('currentUser'));
        if (currentUser) {
            this.token = currentUser.token;
            this.user = currentUser.user;
            this.store.dispatch(new auth.LoginAction({ user: this.user, token: this.token, isLoggedIn: true }));
        }
    }

    login(email, password) {
        let options = new RequestOptions({ headers: utils.getHeaders() });
        return this.http.post(`${utils.hostname()}auth/callback`, 
            JSON.stringify({ email, password }), options)
            .map((response: Response) => {
                // login successful if there's a jwt token in the response
                let resp = response.json();
                let token = resp && resp.jwt;
                let user = resp && resp.user;
                if (token && user && resp.success) {
                    // set token property
                    this.token = token;
                    this.user = user;
                    // store username and jwt token in local storage to keep user logged in between page refreshes
                    // localStorage.setItem('currentUser', 
                    JSON.stringify({ user, token }));
                    // return true to indicate successful login
                    this.store.dispatch(new auth.LoginAction({ token, user, isLoggedIn: true }));
                    return true;
                } else if (resp.error) {
                    return resp.error;
                } else {
                    // return false to indicate failed login
                    return false;
                }
            })
        .catch((error:any) => Observable.throw((error) ? error.json().error : 'Server error'));
    }
}