【问题标题】:Catching async exceptions from CORS request从 CORS 请求中捕获异步异常
【发布时间】:2013-12-10 10:06:05
【问题描述】:
我允许用户通过 ajax 调用从网络服务器授予他们签名的 URL,从而将文件上传到 amazon s3 存储桶。
每隔一段时间,请求就会变得混乱并给我一个 403(至于为什么我不知道)。我尝试在我的 xhr 请求周围捕获块,但没有捕获到这个异常。
看起来像这样
https://bucket.s3.amazonaws.com/hB22C1m9KAll477LWIGx42fTuK4htm?AWSAccess…JKQ6DXF43A&Expires=1385394844&Signature=/OKomeLHinfcDvm30O/9b+9edkw=
403(禁止)
bucket.s3.amazonaws.com/hB22C1m9KQ6DXF4TuK4htm?AWSAccessKeyId=AK...Q62CNKF3PC3QLA&Expires=1385394844&Signature=/OKomeLHkplfcDvm30O/9b+9edkw=:1
所以 2 个问题。
- 是否可以从 CORS 请求中捕获异步异常?
- 为什么我会被禁止? (我能想到的唯一一件事是 URL 是否过期,但我的超时时间很长,并且在通过 AJAX 从服务器接收到它的那一刻就被使用了)。
【问题讨论】:
标签:
javascript
exception
amazon-s3
cors
【解决方案1】:
如果发出 CORS 请求时出错,XMLHttpRequest 的 onError 处理程序将触发。您不会有任何有用的信息来说明错误发生的原因,但您会知道存在错误。更多详情请参阅以下问题:Is it possible to trap CORS errors?
至于为什么你会得到一个禁止的错误,这很难知道。您对 url 过期的评估是可能的,特别是如果有时请求花费的时间比预期的要长。
【解决方案2】:
通过检查 onreadystatechange 事件可以捕获通过 xhr 发送的 CORS 请求的异步异常。
xhr.onreadystatechange = ƒ(e) {
if (this.readyState === 4 && this.status === 200) {
try {
console.log('good');
}
catch (error) {
alert("There has been an error");
console.log(error);
return false;
}
callback();
}
else if (this.readyState === 4 && this.status !== 200) {
console.log('There has been an error');
}
};