【问题标题】:angular $http not returning .error() variables if CORS headers are missing from the response如果响应中缺少 CORS 标头,则角度 $http 不返回 .error() 变量
【发布时间】:2014-12-13 14:27:50
【问题描述】:

我正在通过 websockets 执行 $http.get 并且不知何故 .error 没有填充任何参数。我在 OSX 上使用 angular 1.3.5 和最新的 Chrome,本地主机别名为 mywebsite.com。

$http({method: 'GET', 'ws://mywebsite.com/resource'})
.success(function(response){ ... })
.error(function(err, status){
   console.log(err); <<< here err and status are null respectively 0 even the XHR Response logs 401 in console.
});

任何线索为什么这样做?无论它是什么错误代码,它都不会传递给错误回调。对于 2xx 响应,我确实得到了数据,一切都很好。

澄清一下,.error 回调会正常调用,但不会填充 err 和 status。

【问题讨论】:

  • 是错字吗?你放了两个点headers}). .success
  • 抱歉从真实代码中复制粘贴了我的 headers 变量
  • 如果您尝试使用http 请求而不是ws,您会收到回调吗?

标签: angularjs


【解决方案1】:

好吧,好吧,我发现了正在发生的事情。东西的组合。

首先,我使用的是 KOA,上面的角度将 KOA 作为 REST API。我还使用 koa-jwt 对用户进行身份验证并生成令牌。

现在 api 在子域上运行,甚至我通过 koa-cors 设置 CORS 以允许 * 访问。

问题是 koa-jwt 当令牌过期时,他们只是执行 this.throw(401)。 KOA 处理它的方式是立即终止后续中间件并以该错误退出。那个,不允许设置 koa-cors 标头,无论我将中间件放在哪里(在 koa-jwt 之前或之后)。

因此,优雅的解决方法是将我的顶级产量 next 包装在 try catch 中,并避免让 koa-jwt ctx.throw 传播。

在 Angular 方面,浏览器拒绝将 401 传递给 .error,抱怨它没有找到合适的 CORS 来允许它处理和移交响应:)。

app.use(cors({origin:"*", methods:'GET,HEAD,PUT,POST,DELETE,PATCH'}));  //allow all origins to the API. 
app.use ( function *(next){
    try {
      yield next;
    } catch (err) {
      this.status = err.status || 500;
      this.body = err.message;
      this.app.emit('error', err, this);
    }
});

... more middleware
// middleware below this line is only reached if jwt token is valid
app.use(jwt({secret: config.app.secret}));

允许来自 koa-jwt 的 this.trow(401) 会毁了你的一天。

【讨论】:

    【解决方案2】:

    我觉得你只是打错了,就这样写吧:

    $http({method: 'GET', 'ws://mywebsite.com/resource', headers: headers})
    .success(function(response){ ... })
    .error(function(err, status){
       console.log(err);
    });
    

    但是作为最佳实践,我会这样做

    var request = {
       method: 'GET',
       url: 'ws://mywebsite.com/resource',
       headers: {//insert here header you want, put Origin header only for example purposes
          Origin: 'ws://mywebsite.com/resource'
       }
    }
    
    $http(request)
    .success(function(response){ ... })
    .error(function(err, status){
       console.log(err);
    });
    

    如果错字不是错误(您可能复制了代码),请查看AngularJS $http error function never called

    【讨论】:

    • 这不是拼写错误的问题,在您的代码中,当状态码不是 2xx 时,实际上触发 .error 回调时,err 为 null。您可以从我的代码中省略标题...问题仍然存在。
    • 你是如何定义控制器的?也许你需要一个关闭
    • 是的,刚刚做了,错误函数回调中的“响应”对象传达了与使用 .error/.success 相同的信息。状态 = 0 和状态文本 =“”。必须在角度内较低的水平。讨厌开始调试。感谢您的建议。
    • @Biba 如果你发现了什么,请告诉我。你试过提琴手吗?
    • 做了,请参阅我在解决方案中的完整解释。 CORS 和 401 的大问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2018-12-31
    • 2016-05-09
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多