Как мне перехватить ошибки aws-sdk, возникающие за пределами моего стека вызовов?

#javascript #node.js #aws-sdk

#javascript #node.js #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 вызова, не рискуя сбоем системы?

Ответ №1:

Я создал этот лямбда-запрос :

 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"
  }
}
  

Ответ №2:

Это оказалось полномасштабной ошибкой в AWS — я выпустил исправление, которое было объединено.

Итак, ответ на этот вопрос заключается в том, что перехватить эту ошибку было невозможно… но теперь вам это не нужно.