S3中存在一个已知问题,即如果系统由于某种原因导致其时钟不同步,则上载将失败,并出现RequestTimeTooSkewed
错误。
当这是由服务器触发时,有很多解决方案(基本上是修复服务器时钟),但是当这是由我的应用程序用户的浏览器触发时,我该怎么办?
即使将correctClockSkew
设置为true
也不能修复它。
AWS.config.update({
correctClockSkew: true,
...
});
发布于 2021-04-21 02:22:54
以下是浏览器中JavaScript纠正客户端时钟偏差的潜在解决方案。您的客户端向S3存储桶发送HEAD请求(因此需要权限,或者您使用公共存储桶,并且需要存储桶上的CORS来公开数据头部):
correctClockSkew = (Bucket) => {
const s3 = new AWS.S3();
// Head the bucket to get a Date response. The 'date' header
// will need to be exposed in S3 CORS configuration.
s3.headBucket({ Bucket }, (err, data) => {
if (err) {
console.log('headBucket error:', err);
} else {
console.log('headBucket data:', JSON.stringify(data));
console.log('headBucket headers:', JSON.stringify(this.httpResponse.headers));
if (this.httpResponse.headers.date) {
const date = Date.parse(this.httpResponse.headers.date);
console.log('headers date:', date);
AWS.config.systemClockOffset = new Date() - date;
console.log('clock offset:', AWS.config.systemClockOffset);
// Can now safely generate presigned urls
}
}
});
};
这是从aws-js-s3-explorer项目借来的。
另一种选择是等待重试事件(借用自this comment):
AWS.events.on('retry', function (response: any) {
if (response.error.name === 'RequestTimeTooSkewed') {
var serverTime = Date.parse(response.httpResponse.headers['date']);
var timeNow = new Date().getTime();
AWS.config.systemClockOffset = Math.abs(timeNow - serverTime);
response.error.retryable = true;
}
});
https://stackoverflow.com/questions/67183857
复制相似问题