Javascript 如何捕获在调用堆栈之外发生的aws sdk错误? 形势
我正在使用aws sdk与S3 bucket进行交互 如果我没有设置正确的凭据,sdk会相应地抱怨。然而,它的投诉方法是抛出到调用堆栈之外的错误。我希望能够捕捉到错误并优雅地处理它 问题 下面是导致问题的一个小脚本Javascript 如何捕获在调用堆栈之外发生的aws sdk错误? 形势,javascript,node.js,aws-sdk,Javascript,Node.js,Aws Sdk,我正在使用aws sdk与S3 bucket进行交互 如果我没有设置正确的凭据,sdk会相应地抱怨。然而,它的投诉方法是抛出到调用堆栈之外的错误。我希望能够捕捉到错误并优雅地处理它 问题 下面是导致问题的一个小脚本 import { S3 } from 'aws-sdk'; try { const s3 = new S3(); s3.createPresignedPost({}, (err, data) => { console.log('sup dog'); });
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.
sup-dog
./node_modules/aws sdk/lib/services/s3.js:1241
抛出新错误('无法创建没有bucket的POST对象策略,'
^
错误:无法创建没有bucket、region和凭据的POST对象策略
位于features.constructor.preparePostFields(./node_modules/aws sdk/lib/services/s3.js:1241:13)
在finalizePost(./node_modules/aws sdk/lib/services/s3.js:1204:22)
在./node_modules/aws sdk/lib/services/s3.js:1221:24
完成时(./node_modules/aws sdk/lib/config.js:386:7)
在./node_modules/aws sdk/lib/config.js:428:9
在对象上。(./node\u modules/aws sdk/lib/credentials/credentials\u provider\u chain.js:111:13)
在Object.arrayEach(./node_modules/aws sdk/lib/util.js:516:32)
在resolveNext(./node_modules/aws sdk/lib/credentials/credentials_provider_chain.js:110:20)
在./node_modules/aws sdk/lib/credentials/credentials_provider_chain.js:126:13
在./node_modules/aws sdk/lib/credentials.js:124:23
错误命令失败,退出代码为1。
信息访问https://yarnpkg.com/en/docs/cli/run 有关此命令的文档。
问题
当然,这里的解决方案是使用凭据正确配置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中的一个key参数。它将抛出error和catch
Response:
{
"statusCode": "400",
"body": "\"Unable to create a POST object policy without a bucket, region, and credentials\"",
"headers": {
"Content-Type": "application/json"
}
}
结果是,我发布了一个被合并的
所以,这个问题的答案是不可能捕捉到这个错误…但现在你不必捕捉到