【问题标题】:Angular: $http requests gives -1 statusAngular:$http请求给出-1状态
【发布时间】:2016-12-17 08:37:17
【问题描述】:

node.js 服务器给出“这是一个字符串”。 (写头,写(字符串),结束)。

执行 $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, 文本/纯文本,/"}},"statusText":""}

我尝试从 node.js 或 HTML-text 发送 JSON。没有不同。

【问题讨论】:

  • "status": -1 通常意味着您的后端不可用。可能是 CORS allow-origin 问题。控制台有错误吗?

标签: angularjs angularjs-http


【解决方案1】:

请咨询official Angular docs for $http。它声明如下:

此外,小于 -1 的状态代码被归一化为零。 -1 通常意味着请求被中止,例如使用 config.timeout。

所以我猜你的后端有问题。或许可以在开发者控制台中查看请求是否到达您的服务器。

【讨论】:

  • 你能提供一个 plunkr/jsbin 什么的吗?您的 sie (nu.nl) 是否接受“application/json”?如果没有,$http 什么也得不到。
  • 我试过了:$http.get('validate.jsontest.com/?json={"key":"value"}', {timeout: 10000}).then(function(response) {
  • 为我工作:jsbin.com/zaqaveh/edit?js,console 也许你得到的错误在你的代码中的其他地方?
  • 您的代码有效。感谢分享。哎呀,这可能是原因吗?翻译成英文:Cross-Origin-request被阻止:Same Origin Policy禁止127.0.0.1:8081/echo的外部来源。 (原因:CORS 标头“Access-Control-Allow-Origin”被省略/未指定)。如何解决?
【解决方案2】:

非常感谢 @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();
});

用于简单测试配置的繁重东西 ;-)

【讨论】:

    【解决方案3】:

    我最近遇到这个问题的另一个建议:

    它是间歇性的,不可重现,并且会在不同的时间间隔内发生,有时大约 20 秒后,有时 > 5 毫秒(没有足够的时间进行完整的往返)

    我在测试时隔离的东西:服务器、负载平衡器、防火墙、angularjs 应用程序本身、浏览器。

    广泛的测试免除了所有罪魁祸首,这不是 CORS 问题。问题在于最终用户的互联网连接微弱、断断续续。如果状态返回 -1 并且最大重试次数有效地解决了问题,则实施 HTTP 拦截器重试功能。

    【讨论】:

      【解决方案4】:

      如果您正在与 Tomcat 交谈并使用过滤器设置例如用于受限访问的 401,此过滤器可能会阻止您的 Access-Control 标头与请求一起发送,并且您的 401 将在 Angular 中显示为 -1,即使它显然是浏览器内网络请求日志中的 401 .

      只是在我忘记并在一年内重新做同样愚蠢的事情时将其发布在这里。

      【讨论】:

        猜你喜欢
        • 2017-09-25
        • 1970-01-01
        • 2017-05-14
        • 2016-05-26
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2012-03-09
        相关资源
        最近更新 更多