AWS中使用JavaScript获取数据
JavaScript想要直接获取AWS数据桶的数据,首先需要下载SDK文件,如果需要Athena则需要注意,因为官网的aws-sdk文件是不包括Athena的,导致AWS下没有Athena方法,所以需要自定义包,链接AWS自定义SDK包
SDK文件下载后引入文件内,查看官网文档,查看需要使用的方法,这里使用的DynamoDB,Athena方法,S3部分由我们大数据同事解决了
DynamoDB查询数据,DynamoDB没什么说的有案例先拿案例,直接复制文本,根据自身条件修改config对象即可,关于config对象参数的对应的意思,去看Class List
Athena对于Athena的API文档无力吐槽,JAVA的案例有,可是没有JavaScript的,所以这就很不舒服了,通过我们后台的帮助下找到了一个大佬写的一个案例,这里也给大家链接分享一下Athena的JavaScript案例(大佬写的比较全,还是要结合自身情况来看)
AWS.config.update({
region: "XXXX",
accessKeyId: "XXXXX",
secretAccessKey: "xxxx"
});
var athena = new AWS.Athena();
var queryExecutionId,nextToken;
var params = {
QueryString: 'select * from app_all',
QueryExecutionContext: {
Database: 'bigdata'
},
ResultConfiguration: {
OutputLocation: 's3://linkplay-bigdata/athena'
}
};
athena.startQueryExecution(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else{
queryExecutionId = data.QueryExecutionId
console.log(data);
const keepCheckingRecursively = function(){ // successful response
athena.getQueryExecution(data, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else{
console.log(data); // successful response\
if(data.QueryExecution.Status.State === "SUCCEEDED"){
getQueryResults(queryExecutionId)
}else if(data.QueryExecution.Status.State === "FAILED"){
console.log('失败')
}else{
setTimeout(() => {
keepCheckingRecursively();
}, 2000);
}
}
})
}
keepCheckingRecursively()
}
});
function getQueryResults(QueryExecutionId,NextToken){
var params = {
QueryExecutionId:QueryExecutionId, /* required */
MaxResults:1000,
NextToken:NextToken
};
athena.getQueryResults(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else{
console.log(data); // successful response
if(!data.NextToken){console.log('end')}
else getQueryResults(QueryExecutionId,data.NextToken)
}
});
}
Athena是根据自身情况写的,从DB跟Athena上取出不同的数据,这里的Athena没有S3的处理,因为前文也说了,S3部分我们大数据帮我处理了,如果情况不同,这里个人推荐,看大佬的案例,结合AWS的Clss List看自己需要用到的方法,基本是可以解决问题的
下面是Vue中使用AWS可能出现的几个问题
1.Vue中如果外链aws-sdk的文件包,可能会出现 _xamzrequire is not defined 的错误信息,具体原因不太清楚,这里没有搞清楚,不过如何避免这个错误,这里说一下,关于引入SDK的几种情况
//避免这个错误的出现Vue通过命令行安装AWS-SDK文件
npm install aws-sdk
//安装之后,不要引入aws-sdk而是要引入下面这个命令,因为aws-sdk.js的文件是不健全的,没有Athena方法
var AWS = require('aws-sdk/dist/aws-sdk-react-native')
2.这样就完了,不,还有一个巨坑在前面!!!,因为Vue的Router方面了我们,但是它同样也修改了xhr的指向问题,导致接下来AWS中还会继续报错 xhr.upload.addEventListener is not a function 的错误,有兴趣的可以去看看xhr.upload.addEventListener解决方法
//在vue的modules的文件下找到mockjs文件下的dist/mock.js文件
//在第8308行创建一个新的对象来指定xhr.upload避免Router修改了xhr之后,咱们无xhr可用的问题
MockXMLHttpRequest.prototype.upload = xhr.upload;
3.AWS的方法不能在同一时间调用两个方法,不然会报错,基本上也不会同时使用两个方法,这里就简单提一下