我正在修改现有的Angular项目(不是我的),向我的外部API添加新的调用。
这是服务方法:
getUserName(): Observable<any> {
return this.http.get<any>(environment.apiUrl + URLS.USER_NAME)
}
我在 appcomponent.ts 上使用它,如下所示:
this.userService.getUserName().subscribe((name) => {
this.user = name
})
执行时出现以下错误:
core.js:1673错误,类型错误:无法读取null的属性'length' 在 HttpHeaders .push ../ node_modules/@angular/common/fesm5/http.js.HttpHeaders.applyUpdate中 (http.js:199) 在http.js:170 在Array.forEach() 在HttpHeaders.push ../ node_modules/@angular/common/fesm5/http.js.HttpHeaders.init中 (http.js:170) 在HttpHeaders.push ../ node_modules/@angular/common/fesm5/http.js.HttpHeaders.forEach中 (http.js:235) 在 Observable._subscribe (http.js:1435) 在Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable._trySubscribe中 (Observable.js:43) 在Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable.subscribe (Observable.js:29) 在MapOperator.push ../ node_modules / rxjs / _esm5 / internal / operators / map.js.MapOperator.call中 (map.js:18) 在Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable.subscribe (Observable.js:24)
这似乎是标题问题或某些订阅/可观察到的错误,但我找不到错误在哪里。
请注意,在发出请求之前会引发异常,因此在创建该请求时必须是客户端问题。
编辑:
这是我发现的唯一拦截器:
@Injectable({
providedIn: 'root'
})
export class TenantHttpInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url.indexOf(environment.apiTFSmin) === -1) {
let tenantReq = req.clone({ headers: req.headers.set('current', sessionStorage.getItem('current')) })
if (sessionStorage.getItem('tenant') != null && sessionStorage.getItem('newTenant') == null) {
tenantReq = tenantReq.clone({ headers: tenantReq.headers.append('Tenant', sessionStorage.getItem('tenant')) })
} else if (sessionStorage.getItem('newTenant') != null) {
tenantReq = tenantReq.clone({ headers: tenantReq.headers.append('Tenant', sessionStorage.getItem('newTenant')) })
sessionStorage.removeItem('newTenant')
}
if (req.method === 'POST' || req.method === 'PUT') {
tenantReq = tenantReq.clone({ headers: tenantReq.headers.append('Content-Type', 'application/json') })
}
return next.handle(tenantReq)
} else {
const tenantReq = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + btoa('pescanilla-ext:m12345678*')) })
// const tenantReq = req.clone()
return next.handle(tenantReq)
}
}
}
答案 0 :(得分:1)
您没有检查存储中实际存在的“当前”标头。
let tenantReq = req.clone({ headers: req.headers.set('current', sessionStorage.getItem('current')) })
编辑:一旦您尝试发送标头值为空的请求,HttpClient将引发错误。尝试将sessionStorage.getItem('current')
替换为静态值并进行测试。
答案 1 :(得分:-2)
this.userService.getUserName()。subscribe((name)=> { if(name){this.user = name}})