#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 — я выпустил исправление, которое было объединено.
Итак, ответ на этот вопрос заключается в том, что перехватить эту ошибку было невозможно… но теперь вам это не нужно.