开发者问题收集

Angular TypeError:无法读取 Promise subscribe() 中为 null 的属性“length”

2018-05-07
10934

我正在调用 API 端点并收到错误,但在使用 console.log 时我无法查看错误,因为我收到以下错误。还有其他方法可以获取错误吗?

错误

TypeError: Cannot read property 'length' of null
    at http.js:109
    at Array.forEach (<anonymous>)
    at HttpHeaders.lazyInit (http.js:103)
    at HttpHeaders.init (http.js:251)
    at HttpHeaders.forEach (http.js:354)
    at Observable._subscribe (http.js:2153)
    at Observable._trySubscribe (Observable.js:172)
    at Observable.subscribe (Observable.js:160)
    at Object.subscribeToResult (subscribeToResult.js:23)
    at MergeMapSubscriber._innerSub (mergeMap.js:132)

提供商

import { HttpClient } from '@angular/common/http';
    import { Http, Headers , RequestOptions } from '@angular/http';
    import { Injectable } from '@angular/core';

    @Injectable()
    export class GamesProvider {

    // API url 
    apiUrl = 'http://xxxxx.com/api';

    headers : any;
    options: any;

    this.headers =  new Headers();
    this.headers.append('Accept', 'application/json');
    this.headers.append('Content-Type', 'application/json' );

    this.headers.append('Authorization', 'Bearer' + this.token);

    this.options = new RequestOptions({headers: this.headers});

    getUsers(ex) {
      return new Promise(resolve => {
       this.http.get(this.apiUrl+'/api/online/'+ex, {headers: this.options}).subscribe(data => {
        resolve(data);
       }, err => {
        console.log(err);
       }).catch((err) => {

                // Do messaging and error handling here

                return Observable.throw(err)
            });
     });
    }
2个回答

导致此错误的原因是您向 http 请求添加了一个标头,该标头的值为 null 。您没有在提供的代码中执行此操作,因此这种情况很可能发生在您的 http 拦截器中。

如果您的 http 拦截器向 每个 http 请求添加一个令牌,即使尚未设置令牌的值,或者拦截器未正确访问令牌变量,也很容易发生这种情况。

Joakim
2018-06-05

当标头中的任何值为 nullundefined 时,就会发生这种情况。

例如:

{ headers: this.options }

如果 this.options 类似于:

{ token : null }

您将收到此问题中提到的错误。
在这种情况下,您甚至不会看到由 angular http 生成的请求。

Sumit Chauhan
2019-01-12