Angular $http 错误回调响应始终未定义

Posted

技术标签:

【中文标题】Angular $http 错误回调响应始终未定义【英文标题】:Angular $http error callback response is always undefined 【发布时间】:2013-08-10 10:51:26 【问题描述】:

我在尝试优雅地处理 $http 错误时遇到问题。我正在遍历服务器列表以对状态进行 API 调用。完美地成功完成的调用。失败的那些没有让我访问错误信息。它总是未定义的。这是代码sn-p:

angular.forEach($scope.servers, function (server) 
    // blank out results first
    server.statusResults = ;

    $http.jsonp(server.url + '/api/system/status?callback=JSON_CALLBACK', headers:  'APP-API-Key': server.apiKey ).
        success(function (data, status, headers, config) 
            server.statusResults = data;
        ).
        error(function (data, status, headers, config) 
            // data is always undefined here when there is an error
            console.error('Error fetching feed:', data);
        );
    
);

控制台输出显示正确的 401 错误(我没有输出)和我的控制台错误消息(我确实输出)带有未定义的数据对象。

GET https://server_address/api/system/status?callback=angular.callbacks._1 401 (Unauthorized) angular.min.js:104
Error fetching feed: undefined 

我想要做的不是让 Angular 在日志中显示 401,而是以优雅的方式显示它。但是,由于数据未定义,我无法访问这些信息。

我是 AngularJS 的新手,但我的示例与我在文档中找到的其他示例非常匹配。

我也尝试过使用 $resource 而不是 $http 并遇到了完全相同的问题。

var statusResource = $resource(server.url + '/api/system/status', alt: 'json', callback: 'JSON_CALLBACK',
                 status: method: 'JSONP', isArray: false, headers:  'APP-API-Key': server.apiKey  );

// make status API call
statusResource.status(, function (data) 
    server.statusResults = data;
, function (err) 
    // data is always undefined here when there is an error
    console.log(err);
);

我可能在做一些明显错误的事情,但我不确定还能尝试什么。

【问题讨论】:

服务器的响应究竟是什么样的? 还有see this interesting question and answer。 【参考方案1】:

根据$httpdocs,body

使用变换函数变换的响应体。

由于您返回的 401(未授权)错误,很可能没有返回正文,因此它是未定义的。

如果要记录错误代码,请改为记录status 参数。它包含 HTTP 状态代码,与响应正文不同,它应该是统一的。

【讨论】:

谢谢,但这没有用。错误是 401,但状态码返回 0。 我错过了您使用 JSONP。您无法使用 JSONP 捕获错误代码。请参阅@Pointy 在他的评论中给出的链接,特别是在评论中链接的this answer。 谢谢。 Pointy 的链接很好地解释了这一点。我将在 CORS 中仔细观察。我想这也能解决这个问题? 它可以通过一些警告来解决问题——服务器必须设置为处理 CORS,并且必须响应您的域被授权发出请求。如果您控制远程服务器,那不是问题。如果没有,它可能会也可能不会工作,具体取决于服务器配置。如果它不起作用,您可能必须通过为您的应用提供服务的服务器代理请求。 如何通过服务器代理请求?你能解释一下吗?因为我没有成功让它发挥作用。谢谢

以上是关于Angular $http 错误回调响应始终未定义的主要内容,如果未能解决你的问题,请参考以下文章

回调在 Angular2/Firebase 中生成“TypeError:这是未定义的”

Angular 为啥这个 HTTP 请求响应数组的长度未定义?

Angular2 http observables - 如何使用未定义的类型

在Angular8中将HTTP响应json转换为打字稿对象

Angular 1.5,错误响应状态始终为-1

AngularJS 中的 401 未经授权的错误处理