我有一个使用以下构建的应用程序: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上做一些奇怪的事情:
有没有人见过这个/你知道这个问题可能是什么吗?我怎么解决它?
谢谢!
答案 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 */ } );