2016-04-28 55 views
1

我有一个http覆盖类,用于将我的授权标头添加到我在Ionic2/Angular2应用程序中进行的每个调用。我使用硬编码的授权值进行测试可以正常工作,但是现在我需要添加从本地存储中获取凭证的部分(使用Ionic2 LocalStorage),并且遇到问题返回到我的服务。我收到错误“Can not read property'map of'undefined in [null]”。具有来自LocalStorage授权标题的HTTP客户端--Ionic2/Angular2应用程序

我觉得有一些非常简单的东西我失踪像一个“返回”或与我的嵌套承诺(我想尽可能简化,但一次1问题)。 Ionic 2和Angular 2都很新,所以我一直无法在网上找到合适的解决方案。我并不期望LocalStorage能够兑现承诺。

这是我的代码从我HttpClient的拦截器类:

getAuth(){ 
    return this.local.get("UserName") 
    .then(res => { 
     this.user = res; 
     return this.local.get("Token").then(res => this.session=res); 
    }); 
} 

get(url) { 
    let headers = new Headers({ 
    'Accept': 'application/json', 
    'Content-Type': 'application/json; charset=utf-8' 
    }); 
    let params = new URLSearchParams('format=json'); 

    this.getAuth().then(() => { 
    var authHeader = 'Basic ' + this.encode(this.user + ':{SessionToken}' + this.session); 
    headers.append('Authorization',authHeader); 

    return this.http.get(url, { 
     headers: headers, 
     search: params 
    });   
    }); 
} 

标头是正确的,并调用不用彷徨本身工作正常。只有当我在服务中使用它并尝试.map()时,我才会收到错误。我确实有导入'rxjs/add/operator/map'的;在我的服务。这是我如何把它从服务:

getTodos(id){ 
    var url: string = this.global.APIUrl + "/" + id; 

    return this.httpClient.get(url) 
    .map((res)=> res.json()); 
} 

当浏览器刷新,我得到:

无法读取财产[空]

如果不确定的“地图”我console.log(this.httpClient.get(url))在这一点上,它返回一个承诺,但错误表明它返回“未定义”。也许HttpClient类没有正确编译,但我没有从该类中得到任何错误来找出错误。

回答

2

我会尝试类似的东西利用Observable.fromPromiseflatMap操作:

get(url) { 
    let headers = new Headers({ 
     'Accept': 'application/json', 
     'Content-Type': 'application/json; charset=utf-8' 
    }); 
    let params = new URLSearchParams('format=json'); 

    return Observable.fromPromise(this.getAuth()) 
     .flatMap(() => { 
     var authHeader = 'Basic ' + this.encode(this.user + ':{SessionToken}' + this.session); 
     headers.append('Authorization',authHeader); 

     return this.http.get(url, { 
      headers: headers, 
      search: params 
     });   
     }); 

的问题是,你在那么指定的承诺回调中返回你的观察到的,但不是为get方法。这就是为什么你有一个undefined错误。