我尝试注销时遇到此错误。
`core.js:6014 ERROR TypeError: Cannot read property 'length' of undefined
at http.js:165
at Array.forEach (<anonymous>)
at HttpHeaders.lazyInit (http.js:153)
at HttpHeaders.init (http.js:274)
at HttpHeaders.forEach (http.js:376)
at Observable._subscribe (http.js:2342)
at Observable._trySubscribe (Observable.js:42)
at Observable.subscribe (Observable.js:28)
at subscribeTo.js:20
at subscribeToResult (subscribeToResult.js:7)`
但是,当我从邮递员发送HTTP请求时,代码起作用了。 I successfully logged out when I used the postman
我的身份验证服务
`logout(user){
let headers = new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': this.token }); //this.token is the value of token(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX...)
let options = { headers: headers };
localStorage.clear()
this.token=null;
return this.http.post<response>('http://localhost:3000/users/logout',null,options).pipe(map(res=>{
console.log(res)
return res
}))}
` 这是我订阅此http请求的代码:
onLogout(){
this.authService.logout(this.dataService.storingToken).subscribe(res=>{
console.log(res)
if(res.status===true){
this.router.navigate(["/login"])
}else{
console.log("some error has occurred")
}
})
}
答案 0 :(得分:1)
该错误并非来自您的代码(而是由它引起的)。
该错误引用了Angular HttpClient模块的http.js第165行,它是以下代码段(至少在Angular 8中):
this.lazyInit = (/**
* @return {?}
*/
() => {
this.headers = new Map();
Object.keys(headers).forEach((/**
* @param {?} name
* @return {?}
*/
name => {
/** @type {?} */
let values = headers[name];
/** @type {?} */
const key = name.toLowerCase();
if (typeof values === 'string') {
values = [values];
}
if (values.length > 0) { // <=== THIS IS WHERE THE ERROR IS ===
this.headers.set(key, values);
this.maybeSetNormalizedName(name, key);
}
}));
});
很可能没有设置标头的值。我建议首先完全删除标题,然后查看错误是否消失。如果确实消失了,请一次添加一次。
查看是否实际设置了令牌(不是未定义的)。您可以在logout()方法的开头添加console.log(this.token)。
您也不必在大多数时候显式设置Content-Type,因为Angular在大多数情况下可以自动进行处理。您可以删除它,看看是否有任何区别。
成功注销的事实可能意味着您在Postman中正确(明确地)传递了标头,但没有在Angular中正确地传递它们(如错误所示)。另外,您的后端可能只是没有正确地进行验证。因此,您可以使用Postman注销的事实与该问题无关。
答案 1 :(得分:0)
我认为没有设置标题。您可以尝试以这种方式设置标题
在您的课程中创建一个属性headers: any = ''
this.headers = new HttpHeaders().set("Content-Type", "application/json")
.set("Authorization",this.token)
然后在您的请求中使用它们