如何使用JS检查AWS S3上是否存在动态创建的文件

时间:2016-05-05 06:25:07

标签: javascript amazon-s3 http-status-code-404

我有一个服务器端脚本,在给定的网址有1个页面视图后,在s3存储桶中动态创建一个js文件。服务器端脚本每1分钟运行一次。

在网站上的任何给定网址上,我都有一个尝试调用此动态创建文件的脚本。

如:

var host = window.location.host;
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
})();

问题是如果在网站上创建了一个新URL并且第一个访问者转到该页面,则cron作业有机会运行,因此存储桶中不存在js文件。这会导致404错误,但也会导致页面上的javascript错误导致包含它的js库崩溃。

有没有办法动态检查文件是否存在,如果尚未构建动态创建的文件,是否可以默认使用其他文件?

例如(伪代码):

try{
   script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
}
catch(e){
   404error = true;
}
finally{
   if(404error == true){
      script.src="https://s3.amazonaws.com/some_bucket/DEFAULT.js";
   }
}

在出错时调用其他文件更新了代码。这成功调用了另一个文件,但它仍然会在Chrome中导致404错误。

var host = window.location.host;
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.onerror = function(){
   var host = window.location.host;
   var pathName = window.location.pathname;
   var script = document.createElement('script');
   script.async = true;
   script.type = 'text/javascript';
   script.src="https://s3.amazonaws.com/some_bucket/some_default_file.js";
   var node = document.getElementsByTagName('script')[0];
   node.parentNode.insertBefore(script, node);
}
script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
})();

1 个答案:

答案 0 :(得分:0)

使用script.onerror

var pathName   = window.location.pathname;
var script     = document.createElement('script');
script.async   = true;
script.type    = 'text/javascript';
script.onerror = function() {
  console.log('script failed to load');
};
script.src     = "https://s3.amazonaws.com/some_bucket/" + host + pathName + ".js";
var node       = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);