如何解决如何捕获在调用堆栈之外发生的aws-sdk错误?
情况
我正在使用aws-sdk
与S3存储桶进行交互。
如果我没有设置适当的凭据,则SDK会适当地抱怨。但是,它的投诉方法是一个错误,该错误被抛出到我的调用堆栈之外。我希望能够捕获该错误并优雅地处理它。
问题
这是一个导致问题的小脚本。
import { S3 } from 'aws-sdk';
try {
const s3 = new S3();
s3.createPresignedPost({},(err,data) => {
console.log('sup dog');
});
} catch (err: Error) {
console.log('KABOOM!');
}
我希望它能够捕获s3.createPresignedPost
引发的所有错误并触发捕获,但是实际发生的是sup dog
被发布,然后节点崩溃并指向aws的堆栈跟踪崩溃了, sdk。
sup dog
./node_modules/aws-sdk/lib/services/s3.js:1241
throw new Error('Unable to create a POST object policy without a bucket,'
^
Error: Unable to create a POST object policy without a bucket,region,and credentials
at features.constructor.preparePostFields (./node_modules/aws-sdk/lib/services/s3.js:1241:13)
at finalizePost (./node_modules/aws-sdk/lib/services/s3.js:1204:22)
at ./node_modules/aws-sdk/lib/services/s3.js:1221:24
at finish (./node_modules/aws-sdk/lib/config.js:386:7)
at ./node_modules/aws-sdk/lib/config.js:428:9
at Object.<anonymous> (./node_modules/aws-sdk/lib/credentials/credential_provider_chain.js:111:13)
at Object.arrayEach (./node_modules/aws-sdk/lib/util.js:516:32)
at resolveNext (./node_modules/aws-sdk/lib/credentials/credential_provider_chain.js:110:20)
at ./node_modules/aws-sdk/lib/credentials/credential_provider_chain.js:126:13
at ./node_modules/aws-sdk/lib/credentials.js:124:23
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
问题
当然,这里的解决方案是使用凭证正确配置aws sdk,但我想通过捕获错误并防止硬崩溃来妥善处理未发生的情况。
如何使用createPresignedPost
的回调模式而不冒系统崩溃的风险?
解决方法
我创建了此lambda请求:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event,context) => {
//console.log('Received event:',JSON.stringify(event,null,2));
let body;
let statusCode = '200';
const headers = {
'Content-Type': 'application/json',};
var params = {
Bucket: 'bucketname',Fields: {
key: 'example.pdf'
}
};
try {
s3.createPresignedPost(params,(err,data) => {
body = "successfully";
});
} catch (err) {
statusCode = '400';
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,body,headers,};
};
要测试成功案例,请直接运行代码。对于测试错误注释,参数是存储桶或密钥之一。它将引发错误并捕获。
Response:
{
"statusCode": "400","body": "\"Unable to create a POST object policy without a bucket,region,and credentials\"","headers": {
"Content-Type": "application/json"
}
}
,
结果是a full blown bug in AWS——我发行的a patch被合并了。
所以,这个问题的答案是不可能捕捉到那个错误......但现在你不必了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。