[英]How to download Zip File from an s3 bucket to a local directory within a node.js lambda function
我正在嘗試從 s3 獲取一個 zip 文件並將其存儲在本地目錄中,然后讀取該目錄以確保 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)
任何有關如何修復的示例將不勝感激。
基於 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', () => {})
事件之后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()
});
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.