这是一个简单的问题。
我正在尝试使用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”。
答案 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) => ...