Javascript 如何捕获在调用堆栈之外发生的aws 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'); });

我正在使用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引发的任何错误并触发捕获,但实际发生的是
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"
  }
}
结果是,我发布了一个被合并的

所以,这个问题的答案是不可能捕捉到这个错误…但现在你不必捕捉到