'对象'类型上不存在属性'csrf_token'

时间:2018-03-30 17:48:16

标签: javascript angular typescript local-storage

这是一个简单的问题。

我正在尝试使用angular 5和Drupal 8进行后端登录。连接工作正常,我可以将JSON发送到Drupal站点,它返回一个CSRF令牌。

现在我想将它添加到我的本地存储中。

这是我的login.service.ts中的登录功能

login (user: User): Observable<User> {
      const url = `${this.mainUrl}user/login?_format=json`;  
    const loginReturn = this.http.post(url, user, httpHaljson);   
    console.log (loginReturn);    

    return loginReturn 
    .map(user => 
      {
     // store user details and jwt token in local storage to keep user logged in between page refreshes
      localStorage.setItem('currentUser', JSON.stringify(user));
      return user;           
     })   
    .pipe( 
        tap((user: User) => this.log(`Token `+  JSON.stringify(user.csrf_token))),
        catchError(this.handleError<User>('login'))
      );
}

如果我尝试做这样的事情:

.map(user => 
              {
             // store user details and jwt token in local storage to keep user logged in between page refreshes
              localStorage.setItem('currentUser', JSON.stringify(user));
              console.log ('object' + JSON.stringify(user));
              console.log ('CSRF TOKEN' + JSON.stringify(user.csrf_token));
              return user;           
             }) 

它显示了我的csrf令牌的控制台日志,非常好,但是我在控制台上出现了这个错误:

console:

object{"current_user":{"uid":"4","name":"cravushedal"},"csrf_token":"lY4vX3Ns_PrBkpPqoit4PEuEhXlimhKJ-xBt6ouUMXc","logout_token":"KOvJljv47rO3tRV3OG37ZKH57VWAG2gGxPe8nwCmN7A"}

login.service.ts:39 CSRF TOKEN"lY4vX3Ns_PrBkpPqoit4PEuEhXlimhKJ-xBt6ouUMXc"
  

它说:src / app / login.service.ts(37,65)中的错误:错误TS2339:   “对象”类型中不存在属性“csrf_token”。   enter image description here

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,这是因为Typescript无法计算user属性的类型。

当您致电HttpClient#post without a type argument时,它会返回Observable<Object>个实例,而Object没有任何属性(而且,与any不同,isn&#39; t&#34;灵活&#34;)。

您需要像这样打电话给HttpClient#post,以便返回值变为Observable<User>

this.http.post<User>(url, user, httpHaljson); 

使用map时,您还可以指定其实际类型:

.map((user: User) => ...