最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

解压缩文件并上传到S3

IT培训 admin 7浏览 0评论

解压缩文件并上传到S3

节点上的路由采用zip文件,然后从中将其解压缩到内存中并将其上传到S3存储桶。一切都工作正常,但我正在努力解决zip文件中的所有文件完成后。

function unzipAndUploadToS3(fileInfo) {
    return new Promise((resolve, reject) => {
        fs.createReadStream(fileInfo.zip.path)
            .pipe(unzipper.Parse())
            .pipe(etl.map(entry => {
                if (checkEntry(entry.path)) {
                    fileInfo.name = entry.path;
                    entry
                        .buffer()
                        .then(content => {
                            fileInfo.data = content;
                            AWS.uploadToS3(fileInfo).then(result => {
                                console.log(result.Location);
                                resolve(result.Location);  //ALWAYS Resolves here
                            }).catch(err => {
                                console.error(err);
                                reject(err);
                            })
                        })
                }
                else
                    entry.autodrain();
            }))
    });
}

我尝试过Promise.all和Async / Await,但似乎可以解决它。

回答如下:

我之前从未使用过etl,但他们的documentation有评论说

从流转换到承诺链......

然后给出代码.promise().then(...)。你说你尝试过Promise.all,但你没有说怎么做,所以我不知道你是否已经尝试过这个。但这是我认为可能会发生的方向:

function unzipAndUploadToS3(fileInfo) {
  return new Promise((resolve, reject) => {
    fs.createReadStream(fileInfo.zip.path)
      .pipe(unzipper.Parse())
      .pipe(etl.map(entry => {
        if (checkEntry(entry.path)) {
          fileInfo.name = entry.path;
          return entry.buffer() //<- return promise
            .then(content => {
              fileInfo.data = content;
              return AWS.uploadToS3(fileInfo) //<- return promise
            })
        }
        else
          entry.autodrain();
      }))
      .promise().then(awsPromises => Promise.all(awsPromises)) //<- return promise
      .then(x => resolve('x should be an array of s3 results'))
      .catch(err => reject(err));
  });
}

为了实现这一点,尽管所有的promise都需要正确链接在一起以进行条目缓冲,然后上传到s3。我标记了重要的回报,以保持与评论的链接。

还有一些对我来说有点不对劲:我无法相信你能够继续重复使用同样的fileInfo这样的多个文件。对我来说看起来像竞争条件:在下一个文件覆盖fileInfo.datafileInfo.name之前,上一次上传是否完成?我的猜测是你最好在地图中创建一个新的fileInfo对象,而不是对zip中的所有文件重复使用相同的文件。

解压缩文件并上传到S3

节点上的路由采用zip文件,然后从中将其解压缩到内存中并将其上传到S3存储桶。一切都工作正常,但我正在努力解决zip文件中的所有文件完成后。

function unzipAndUploadToS3(fileInfo) {
    return new Promise((resolve, reject) => {
        fs.createReadStream(fileInfo.zip.path)
            .pipe(unzipper.Parse())
            .pipe(etl.map(entry => {
                if (checkEntry(entry.path)) {
                    fileInfo.name = entry.path;
                    entry
                        .buffer()
                        .then(content => {
                            fileInfo.data = content;
                            AWS.uploadToS3(fileInfo).then(result => {
                                console.log(result.Location);
                                resolve(result.Location);  //ALWAYS Resolves here
                            }).catch(err => {
                                console.error(err);
                                reject(err);
                            })
                        })
                }
                else
                    entry.autodrain();
            }))
    });
}

我尝试过Promise.all和Async / Await,但似乎可以解决它。

回答如下:

我之前从未使用过etl,但他们的documentation有评论说

从流转换到承诺链......

然后给出代码.promise().then(...)。你说你尝试过Promise.all,但你没有说怎么做,所以我不知道你是否已经尝试过这个。但这是我认为可能会发生的方向:

function unzipAndUploadToS3(fileInfo) {
  return new Promise((resolve, reject) => {
    fs.createReadStream(fileInfo.zip.path)
      .pipe(unzipper.Parse())
      .pipe(etl.map(entry => {
        if (checkEntry(entry.path)) {
          fileInfo.name = entry.path;
          return entry.buffer() //<- return promise
            .then(content => {
              fileInfo.data = content;
              return AWS.uploadToS3(fileInfo) //<- return promise
            })
        }
        else
          entry.autodrain();
      }))
      .promise().then(awsPromises => Promise.all(awsPromises)) //<- return promise
      .then(x => resolve('x should be an array of s3 results'))
      .catch(err => reject(err));
  });
}

为了实现这一点,尽管所有的promise都需要正确链接在一起以进行条目缓冲,然后上传到s3。我标记了重要的回报,以保持与评论的链接。

还有一些对我来说有点不对劲:我无法相信你能够继续重复使用同样的fileInfo这样的多个文件。对我来说看起来像竞争条件:在下一个文件覆盖fileInfo.datafileInfo.name之前,上一次上传是否完成?我的猜测是你最好在地图中创建一个新的fileInfo对象,而不是对zip中的所有文件重复使用相同的文件。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论