0

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

在 EC2 机器上,我做了一个:

sudo apt-get update

完成此操作后,我开始在我的应用程序中收到跨域共享错误(查看 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 的问题。

有没有人见过这个/你知道问题可能是什么以及我该如何解决它?

谢谢!

4

1 回答 1

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 */ } );
于 2014-02-13T12:28:52.957 回答