Javascript 在Angular 4中对http请求使用resolve时出错

Javascript 在Angular 4中对http请求使用resolve时出错,javascript,angular,observable,Javascript,Angular,Observable,我试图在Angular 4项目中使用resolve预取http请求,但每当节点服务器出现错误响应时,它就会抛出一个错误:Uncaught(in promise):状态为的响应。当出现成功的http代码(如200)时,代码工作正常。下面是我正在处理的解析代码: @Injectable() export class LoginResolverService implements Resolve<Object> { constructor(private http: Http) {

我试图在Angular 4项目中使用resolve预取http请求,但每当节点服务器出现错误响应时,它就会抛出一个
错误:Uncaught(in promise):状态为
的响应。当出现成功的http代码(如200)时,代码工作正常。下面是我正在处理的
解析
代码:

@Injectable()
export class LoginResolverService implements Resolve<Object> {

  constructor(private http: Http) {
  }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Object> | Promise<Object> | Object {
    const headers = new Headers({'Content-Type': 'application/json'});
    return this.http.get('http://localhost:3000/login_check', {headers: headers})
      .map((response: Response) => {
        return response.json();
      }).catch((error: Response) => Observable.throw(error.json()));
  }
}
@Injectable()
导出类LoginResolversService实现解析{
构造函数(专用http:http){
}
解析(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|对象{
const headers=新的头({'Content-Type':'application/json'});
返回此.http.get('http://localhost:3000/login_check“,{headers:headers})
.map((响应:响应)=>{
返回response.json();
}).catch((error:Response)=>Observable.throw(error.json());
}
}
组件文件代码:

loginState: Observable<Object>;
  constructor(private route: ActivatedRoute, private router: Router) { }

  ngOnInit() {
    this.route.data.subscribe((data: Data) => {
      this.loginState = data['isLoggedin'];
      this.loginState.subscribe((response: any) => {
        console.log(response);
      }, (error: any) => {
        console.log(error)
      })
    });
  }
loginState:可观察;
构造函数(专用路由:ActivatedRoute,专用路由器:router){}
恩戈尼尼特(){
this.route.data.subscribe((数据:data)=>{
this.loginState=data['isLoggedin'];
this.loginState.subscribe((响应:any)=>{
控制台日志(响应);
},(错误:任意)=>{
console.log(错误)
})
});
}
路线相关代码:

{path:'notifications',loadChildren:'./notifications/notifications.module#NotificationsModule',resolve:{isLoggedin:LoginResolverService}}


请帮助我解决此问题,因为我找不到有关在我的解析程序服务中使用
resolve
http

的任何正确信息,我调用了一个单独的数据服务来实际获取数据:

resolve(route: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<IProduct> {
    let id = route.paramMap.get('id');
    if (isNaN(+id)) {
        console.log(`Product id was not a number: ${id}`);
        this.router.navigate(['/products']);
        return Observable.of(null);
    }
    return this.productService.getProduct(+id)
        .map(product => {
            if (product) {
                return product;
            }
            console.log(`Product was not found: ${id}`);
            this.router.navigate(['/products']);
            return null;
        })
        .catch(error => {
            console.log(`Retrieval error: ${error}`);
            this.router.navigate(['/products']);
            return Observable.of(null);
        });
}
就这样

或者,如果您希望“已解析数据”属性将在不更改路线的情况下更改(不包括用户对该数据的编辑),则可以使用:

ngOnInit(): void {
    this.route.data.subscribe(data => {
         this.product = data['product'];
    });
}

路由器本身调用解析器并处理订阅。所以你不必这样做。

看起来不错。你在哪里订阅它?@echonax我无法订阅,因为我正在返回一个对象。你正在返回一个响应为对象的可观察对象
this.http.get
返回一个observable@echonax如果我试图在组件文件中订阅它,我会得到一个错误,因为类型“Object”上不存在“subscribe”。下面是我在组件文件
this.route.data.subscribe((data:data)=>{this.loginState=data['isLoggedin'];this.loginState.subscribe((response:any)=>{console.log(response);},(error:any)=>{console.log(error)})这是一个类型检查问题。从方法返回类型中删除
|Object
|Promise
部分。如果您要添加代码,请将其添加到您的问题中,请勿在评论部分添加。
ngOnInit(): void {
    this.route.data.subscribe(data => {
         this.product = data['product'];
    });
}