Javascript 财产';csrf#U令牌';不存在于类型';对象';

Javascript 财产';csrf#U令牌';不存在于类型';对象';,javascript,angular,typescript,local-storage,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 loginRe

这是一个简单的问题

我正在尝试使用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'))
      );
}
它显示了我的csrf令牌的控制台日志,非常好,但我在控制台上遇到了以下错误:

控制台:

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: 类型“Object”上不存在属性“csrf_令牌”。


如注释中所述,这是由于Typescript无法计算
用户
属性的类型

调用时,它返回一个
可观察的
实例,
对象
没有任何属性(并且与
任何
不同,它不“灵活”)

您需要像这样键入对
HttpClient#post
的调用,以便返回值变为
可观察的


如注释中所述,这是由于Typescript无法计算
用户
属性的类型

调用时,它返回一个
可观察的
实例,
对象
没有任何属性(并且与
任何
不同,它不“灵活”)

您需要像这样键入对
HttpClient#post
的调用,以便返回值变为
可观察的


错误指的是哪一行?如果只返回相同的值,为什么还要使用
map
?您可以在
点击
中使用
localStorage.setItem
。此行:
console.log('CSRF-TOKEN'+JSON.stringify(user.CSRF_-TOKEN))
@JetoTry将
this.http.post(…)
更改为
this.http.post(…)
和/或
map(user=>…)
更改为
map((user:user)=>…)
@ValRob因为webpack和typescript在编译时检查属性,而
对象上不存在属性
如果您没有特别提到
用户
作为类型调用
post
时没有类型参数,默认返回值是
对象
的一个实例,其中没有您需要的任何属性。错误指的是哪一行?如果只返回相同的值,为什么还要使用
map
?您可以在
点击
中使用
localStorage.setItem
。此行:
console.log('CSRF-TOKEN'+JSON.stringify(user.CSRF_-TOKEN))
@JetoTry将
this.http.post(…)
更改为
this.http.post(…)
和/或
map(user=>…)
更改为
map((user:user)=>…)
@ValRob因为webpack和typescript在编译时检查属性,而
对象上不存在属性
如果您没有特别提到
用户
作为类型调用
post
时没有类型参数,默认返回值是
对象
的一个实例,它没有您需要的任何属性。或者只是
this.http.post…
@PMateus确实有效,但是当我们有可用的实际类型时不使用它有点遗憾:)或者只是
this.http.post…
@PMateus确实有效,但是当我们有可用的实际类型时不使用它有点遗憾:)
object{"current_user":{"uid":"4","name":"cravushedal"},"csrf_token":"lY4vX3Ns_PrBkpPqoit4PEuEhXlimhKJ-xBt6ouUMXc","logout_token":"KOvJljv47rO3tRV3OG37ZKH57VWAG2gGxPe8nwCmN7A"}

login.service.ts:39 CSRF TOKEN"lY4vX3Ns_PrBkpPqoit4PEuEhXlimhKJ-xBt6ouUMXc"
this.http.post<User>(url, user, httpHaljson); 
.map((user: User) => ...