#amazon-web-services #amazon-s3 #aws-lambda
#amazon-web-services #amazon-s3 #aws-lambda
Вопрос:
Приведенный ниже код позволяет мне обновлять изображение или видео в S3 из командной строки как узел js, но не из функции lamba, можно ли узнать, почему? Лямбда-функция не возвращает никаких ошибок, она просто не загружает файл.
const fs = require('fs');
const http = require('http');
const AWS = require('aws-sdk');
const request = require('request');
function uploadFile(data, fileName)
{
const s3 = new AWS.S3();
console.log(data)
const params = {
Bucket: 'trakbucket', // pass your bucket name
Key: fileName, // file will be saved as testBucket/contacts.csv
Body: JSON.stringify(data, null, 2)
};
s3.upload(params, function(s3Err, data) {
if (s3Err) throw s3Err
console.log(`File uploaded successfully at ${data.Location}`)
});
};
exports.handler = async (event) => {
let videoURL = "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg";
let file_name = "video.mp4"
let file_path = "/tmp/" file_name
request.get(videoURL, function (error, response, body) {
if (!error amp;amp; response.statusCode == 200) {
var data = body;
console.log(data)
uploadFile(data, file_name)
console.log("End")
}
});
};
Ответ №1:
Поскольку вы используете асинхронный обработчик, я думаю, проблема в том, что ваша функция завершается до того, как тело обработчика получит возможность запуска.
Один из способов исправить это — использовать Promise
, как показано в документах AWS. Например:
exports.handler = async (event) => {
const promise = new Promise(function(resolve, reject) {
let videoURL = "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg";
let file_name = "video.mp4"
let file_path = "/tmp/" file_name
request.get(videoURL, function (error, response, body) {
if (!error amp;amp; response.statusCode == 200) {
var data = body;
console.log(data)
uploadFile(data, file_name)
console.log("End")
}
});
})
return promise;
};
Вышеуказанные изменения являются только примерными, поэтому, вероятно, некоторые корректировки все же потребуются.
Комментарии:
1. Я перевел его в режим синхронизации, и все работало правильно, я постараюсь использовать promise в асинхронном режиме, но это должно быть то, что вы указали. Большое спасибо!