Angular: $http 请求给出 -1 状态
Angular: $http requests gives -1 status
一个 node.js 服务器给出 "This is a string"。 (写头,写(字符串),结束)。
执行 $http 请求时,我看到 node.js 服务器正在响应并发回信息。
在 Angular 我执行以下请求:
angular.module('phoneList').
component('phoneList', {
templateUrl: 'phone-list/phone-list.template.html',
controller: function PhoneListController($http) {
var self = this;
$http.get('http://127.0.0.1:8081/echo').then(function(response) {
self.data = response.data;
}, function(err) {
self.error = err;
self.status = response.status;
self.statusText = response.statusText;
});
}
});
回应
{"data":null,"status":-1,"config":{"method":"GET","transformRequest":[null],"transformResponse":[null],"url":"http://127.0.0.1:8081/echo","headers":{"Accept":"application/json,
text/plain, /"}},"statusText":""}
我都试过了,只是从 node.js 或 HTML-text 发送 JSON。没有不同。
请参考official Angular docs for $http。它声明如下:
Also, status codes less than -1 are normalized to zero. -1 usually means the request was aborted, e.g. using a config.timeout.
所以我猜这是你的后端的问题。也许在开发人员控制台中查看请求是否到达您的服务器。
非常感谢 @Sebastian Sebald 和 @Dex 指导我找到解决方案。我只是想在我的计算机上 运行 一个简单的 Node.js 服务器为我的(简单的)Angular 脚本提供消息。
是的,这是一个跨域问题。
@TonyTakeshi 很好地解决了这个问题。您可以通过以下方式在 node.js 服务器文件中解决它:
app.all('*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
简单测试配置的繁重内容;-)
如果您正在与 Tomcat 通话并使用设置例如限制访问的 401,此过滤器可能会阻止您的 Access-Control headers 与请求一起发送,并且您的 401 将在 Angular 中显示为 -1,即使它很明显in-browser 网络请求日志中的 401。
只是在我忘记和 re-do 一年内发生同样愚蠢的事情时将其张贴在这里。
我最近遇到这个问题的另一个建议:
它是间歇性的,不可重现,并且会在变化的时间间隔内发生,有时会在大约 20 秒后,有时会超过 5 毫秒(没有足够的时间进行完整的往返)
我在测试时隔离的东西:服务器、负载平衡器、防火墙、angularjs 应用程序本身、浏览器。
广泛的测试排除了所有罪魁祸首,这不是 CORS 问题。问题是最终用户微弱、断断续续的互联网连接。如果状态返回 -1 并且最大重试次数有效地解决了问题,则实施 HTTP 拦截器重试功能。
一个 node.js 服务器给出 "This is a string"。 (写头,写(字符串),结束)。
执行 $http 请求时,我看到 node.js 服务器正在响应并发回信息。
在 Angular 我执行以下请求:
angular.module('phoneList').
component('phoneList', {
templateUrl: 'phone-list/phone-list.template.html',
controller: function PhoneListController($http) {
var self = this;
$http.get('http://127.0.0.1:8081/echo').then(function(response) {
self.data = response.data;
}, function(err) {
self.error = err;
self.status = response.status;
self.statusText = response.statusText;
});
}
});
回应
{"data":null,"status":-1,"config":{"method":"GET","transformRequest":[null],"transformResponse":[null],"url":"http://127.0.0.1:8081/echo","headers":{"Accept":"application/json, text/plain, /"}},"statusText":""}
我都试过了,只是从 node.js 或 HTML-text 发送 JSON。没有不同。
请参考official Angular docs for $http。它声明如下:
Also, status codes less than -1 are normalized to zero. -1 usually means the request was aborted, e.g. using a config.timeout.
所以我猜这是你的后端的问题。也许在开发人员控制台中查看请求是否到达您的服务器。
非常感谢 @Sebastian Sebald 和 @Dex 指导我找到解决方案。我只是想在我的计算机上 运行 一个简单的 Node.js 服务器为我的(简单的)Angular 脚本提供消息。
是的,这是一个跨域问题。 @TonyTakeshi 很好地解决了这个问题。您可以通过以下方式在 node.js 服务器文件中解决它:
app.all('*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
简单测试配置的繁重内容;-)
如果您正在与 Tomcat 通话并使用设置例如限制访问的 401,此过滤器可能会阻止您的 Access-Control headers 与请求一起发送,并且您的 401 将在 Angular 中显示为 -1,即使它很明显in-browser 网络请求日志中的 401。
只是在我忘记和 re-do 一年内发生同样愚蠢的事情时将其张贴在这里。
我最近遇到这个问题的另一个建议:
它是间歇性的,不可重现,并且会在变化的时间间隔内发生,有时会在大约 20 秒后,有时会超过 5 毫秒(没有足够的时间进行完整的往返)
我在测试时隔离的东西:服务器、负载平衡器、防火墙、angularjs 应用程序本身、浏览器。
广泛的测试排除了所有罪魁祸首,这不是 CORS 问题。问题是最终用户微弱、断断续续的互联网连接。如果状态返回 -1 并且最大重试次数有效地解决了问题,则实施 HTTP 拦截器重试功能。