如何捕获在我的调用堆栈之外发生的 aws-sdk 错误?

How do I catch aws-sdk errors that occur outside of my call stack?

情况

我正在使用 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,
    };
};

用于测试成功案例 运行 代码原样。用于测试错误注释参数,其中一个键要么是 bucket 要么是 key。它会抛出错误并捕获。

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 -- I issued a patch被合并了

所以,这个问题的答案是之前不可能捕捉到那个错误...但现在你不必捕捉了。