Я написал программу, которая создает файлы HTML.Затем я пытаюсь загрузить файлы в мое хранилище S3 в конце программы.Кажется, что проблема в том, что моя программа завершает работу, прежде чем позволить функции завершить или получить обратный вызов от функции.
Вот суть моего кода:
let aws = require('aws-sdk');
aws.config.update({
//Censored keys for security
accessKeyId: '*****',
secretAccessKey: '*****',
region: 'us-west-2'
});
let s3 = new aws.S3({
apiVersion: "2006-03-01",
});
function upload(folder, platform, browser, title, data){
s3.upload({
Bucket: 'html',
Key: folder + platform + '/' + browser + '/' + title + '.html',
Body: data
}, function (err, data) {
if (err) {
console.log("Error: ", err);
}
if (data) {
console.log("Success: ", data.Location);
}
});
}
/*
*
* Here is where the program generates HTML files
*
*/
upload(folder, platform, browser, title, data);
Если я вызываюфункция upload()
(сконфигурированная с тестовыми / фиктивными данными) перед разделом генерации HTML моего кода, загрузка успешно завершена.Тестовый файл успешно загружен на S3.Однако, когда функция вызывается в конце моего кода, я не получаю сообщение об ошибке или об успешном завершении.Скорее программа просто завершается, и файл не загружается на S3.
Есть ли способ дождаться обратного вызова из моей функции upload()
, прежде чем продолжить программу?Как я могу предотвратить завершение программы перед загрузкой моих файлов на S3?Спасибо!
Редактировать: После реализации ответа Дейва я обнаружил, что программа все еще не загружает мои файлы.Я все еще не получаю сообщение об успехе или об ошибке любого вида.На самом деле, похоже, что программа просто пропускает функцию upload()
.Чтобы проверить это, я добавил console.log("test")
после вызова upload()
, чтобы посмотреть, будет ли он выполняться.Конечно же, журнал печатается успешно.
Вот еще немного информации о проекте: я использую WebdriverIO v4 для создания HTML-отчетов о прохождении / неудаче различных тестов.Я собираю результаты тестов через несколько слушателей событий (например, this.on('test:start')
, this.on('suite:end')
и т. Д.).Последнее событие - this.on('end')
, которое вызывается, когда все тесты завершили выполнение.Именно здесь результаты теста сортируются в зависимости от того, на какой операционной системе он работал, браузере и т. Д.
Теперь я замечаю, что моя программа не будет делать ничего, что связано с S3 в this.on('end')
обработчик событий, даже если я поместил его в самом начале обработчика, хотя я все еще убежден, что это потому, что ему не хватает времени для выполнения, потому что обработчик может обрабатывать результаты и создавать файлы HTML очень быстро.У меня есть этот фрагмент кода, который перечисляет все сегменты в моем S3:
s3.listBuckets(function (err, data) {
if (err) {
console.log("Error: ", err);
} else {
console.log("Success: ", data.Buckets);
}
});
Даже это не возвращает никакого результата при запуске в начале this.on('end')
.У кого-нибудь есть какие-либо идеи?Я действительно в тупике.
Редактировать: Вот мой новый код, который реализует предложение Навина:
this.on('end', async (end) => {
/*
* Program sorts results and creates variable 'data', the contents of the HTML file.
*/
await s3.upload({
Bucket: 'html',
Key: key,
Body: data
}, function (err, data) {
if (err) {
console.log("Error: ", err);
}
if (data) {
console.log("Success: ", data.Location);
}
}).on('httpUploadProgress', event => {
console.log(`Uploaded ${event.loaded} out of ${event.total}`);
});
}
Логика кажется разумной, но все равно я не получаю сообщения об успехе или ошибке, иЯ не вижу прогресс загрузки.Файл HTML не загружается на S3.