#node.js #amazon-web-services #amazon-s3 #aws-lambda
#node.js #amazon-веб-сервисы #amazon-s3 #aws-lambda
Вопрос:
Когда я запускаю эту функцию, она сообщает, что она выполнена успешно, но файла нет в корзине s3.
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
AWS.config.update({
region: 'us-west-2',
accessKeyId: 'xxx',
secretAccessKey: 'xxx'
});
var s3 = new AWS.S3();
s3.putObject({
Bucket: 'mybucket',
Key: 'test.json',
Body: [{test: 'test'}, {test: 'test'}],
ContentType: "application/json"
}, function(){});
context.succeed('SUCCESS');
};
Ответ №1:
NodeJS — интересный язык.
Большинство языков обработали бы ваш код следующим образом
- AWS.config.update({..})
- var s3 = ..
- s3.putObject(.., обратный вызов); (Это требует времени, поэтому придется подождать до завершения)
- context.success(..)
Узел js будет обрабатываться в таком порядке.
- AWS.config.update({..})
- var s3 = ..
- s3.putObject(.., обратный вызов); (Это требует времени, поэтому я перейду к следующему шагу)
- context.success(..)
- s3.putObject (.., обратный вызов) завершен. Сейчас я вызову обратный вызов.
- обратный вызов (ошибка, повторный вызов). Он вызывает обратный вызов с ошибкой. Поскольку ваша программа имеет пустой обратный вызов function(){}, она ничего не сделает с ошибкой, и вы не узнаете об этом.
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
AWS.config.update({
region: 'us-west-2',
accessKeyId: 'xxx',
secretAccessKey: 'xxx'
});
var s3 = new AWS.S3();
s3.putObject(
{
Bucket: 'mybucket',
Key: 'test.json',
Body: [{test: 'test'}, {test: 'test'}],
ContentType: "application/json"
},
function(err, res){
if(err){
console.log(err);
}
callback(err, "processed");
});
};
^ Обратный вызов сообщит lambda, что это конец скрипта.
Теперь это будет обрабатываться следующим образом.
- AWS.config.update({..})
- var s3 = ..
- s3.putObject(.., обратный вызов); (Это требует времени, но другого шага нет, поэтому я подожду)
- s3.putObject (.., обратный вызов) завершен. Сейчас я вызову обратный вызов.
- обратный вызов (ошибка, повторный вызов). Он вызывает обратный вызов с ошибкой. Вы выведете сообщение об ошибке и сможете отладить свою программу.
- обратный вызов (ошибка, ‘processed’) завершит лямбду.
Ответ №2:
Вы можете использовать Q https://www.npmjs.com/package/q или NodeJS обещает обрабатывать задачи в требуемом порядке.