形势
我正在使用aws-sdk
与S3 bucket进行交互。
如果我没有设置正确的凭据,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
抛出的任何错误并触发catch,但实际发生的是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,
};
};
对于测试成功案例,请按原样运行代码。对于测试错误注释参数,请选择bucket或key中的一个。它会抛出错误和接球。
Response:
{
"statusCode": "400",
"body": ""Unable to create a POST object policy without a bucket, region, and credentials"",
"headers": {
"Content-Type": "application/json"
}
}
这是AWS中的一个全面漏洞——我发布了一个合并的补丁。
所以,这个问题的答案是,不可能发现那个错误。。。但现在你不必了。