Как загрузить Zip-файл из корзины s3 в локальный каталог в функции node.js lambda - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь получить zip-файл из s3 и сохранить его в локальном каталоге, а затем прочитать этот каталог, чтобы убедиться, что zip.file существует. Есть ли верный способ сделать это. Когда я читаю, чтобы увидеть, находится ли файл в каталоге tmp, его там нет.

// MAKE DIRECTORIES FOR ZIPPED AND UNZIPPED FOLDER
const zipDirFolder = await mkdirp(localZippedFolder, { recursive: true });
const unZipDirFolder = await mkdirp(localUnzippedFolder, { recursive: true });

// VERIFY THAT DIRECTORIES ARE CREATED
const zipFolderChecker = fs.statSync(zipDirFolder);
const unZipFolderChecker = fs.statSync(unZipDirFolder);
console.log('SUCCESS: 2 DIRECTORIES CREATED');

// CREATE STREAMS FOR S3 BUCKET OBJECTS
const tempFileName = path.join(zipDirFolder, 'downloaded.zip');
const tempFileDownload = fs.createWriteStream(tempFileName);

// DOWNLOAD ZIP FILE FROM S3 BUCKET TO TEMP FOLDER
const getS3Object = await s3.getObject(params).createReadStream().pipe(tempFileDownload);
console.log('SUCCESS: ZIP FILE DOWNLOADED');

// LIST FILES IN ZIP FOLDER DIRECTORY
await new Promise((resolve, reject) => {
    fs.readdir(zipDirFolder, (error, files) => {
        error ? reject(error) : resolve(files);
        console.log(files)

Буду очень признателен за любые примеры исправлений.

1 Ответ

0 голосов
/ 10 марта 2020

на основе AWS документации: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/requests-using-stream-objects.html.

Ваш код почти правильный, проблема с ожиданием завершения процесса загрузки. Не могли бы вы добавить отладочную информацию в ваш код:

const s3Stream = s3.getObject(params).createReadStream();
    s3Stream.on('error', function(err) {
        // NoSuchKey: The specified key does not exist
        console.error(err);
    });
    // there is the main debugging point
    s3Stream.pipe(tempFileDownload).on('error', function(err) {
        // capture any errors that occur when writing data to the file
        console.error('File Stream:', err);
    }).on('close', function() {
        console.log('Done.');
    });

Также ваш поток закрыт не после оператора await, а on('close', () => {}) события. Вам нужно преобразовать его в обещание:

async getObjectToFile(bucket, key):Promise<void> {     
        return new Promise<void>((res, rej) => {
            // *
            // *
           //your code
s3Stream.pipe(tempFileDownload).on('error', function(err) {
            // capture any errors that occur when writing data to the file
            console.error('File Stream:', err);
            rej(err) ;
        }).on('close', function() {
            console.log('Done.');
            res()
        });

        });
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...