有趣的谜题:AngularJS应用程序挂在http 304上

时间:2013-11-06 02:24:04

标签: angularjs cors

我有一个使用以下构建的应用程序:PhoneGap + AngularJS(客户端)--- ExpressJS + MongoDB(服务器)。该应用程序托管在Ubuntu计算机上的Amazon EC2上。该应用程序工作得很好,直到......

在EC2机器上我做了一个:

sudo apt-get update

在我这样做之后,我开始在我的应用程序中看到Cross Origin共享错误(在Chrome中查看控制台)。在我的AngularJS应用程序中,我有类似的代码抛出错误:

$http.get('http://amazon.ec2.foo/offers').success(function(data) { });

错误是:

XMLHttprequest doesn’t allow Cross-Origin Resource Sharing on http://localhost:8000

所以,我更新了我的服务器应用程序:

app.all("/api/*", function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
      res.header("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS");
      return next();
});

这一开始似乎很好 - 我停止了Cross Origin错误,我可以在控制台中看到来自http请求的响应。但是,我的应用程序将停止响应,并在打印响应到控制台后似乎立即挂起 - 我无法单击网页的任何部分,或打开开发人员控制台等。唯一的办法是关闭选项卡并重新打开它。 Chrome中的其他标签完全正常。

经过多次调试后,我想早点(没有那些应用程序标题),我从服务器获得了一个HTTP 200,但现在我得到一个HTTP 304(未修改),这似乎是Angular视为错误。

我发现在标签上等待约2分钟会导致网页加载从http请求中收到的数据 - 但网页没有响应。

我已经确认了一些事情要缩小到AngularJS在HTTP 304上做一些奇怪的事情:

  • 我在localhost上运行此操作时出现同样的错误 - 因此,它与EC2无关。
  • 我删除了mongodb只是发回一些简单的数据 - 所以,它与Mongo无关。
  • 我在Chrome中运行它作为一个简单的服务器 - 所以,我已经取消了PhoneGap作为问题。

有没有人见过这个/你知道这个问题可能是什么吗?我怎么解决它?

谢谢!

1 个答案:

答案 0 :(得分:0)

Angular将304状态代码视为失败,以捕获304(未经测试):

var prom = $http.get('http://amazon.ec2.foo/offers')
.catch(function(resp){
    if(resp.status !== 304){ $q.reject(resp) }
    return resp;   // response 
})
.catch(function(err){
    // handle or throw error
});

// Success responses and 304 responses are now available through the $http promise
prom.then( function(resp){ /* handle 200 and 304 response */ } );