使用NodeJS&amp ;;清空任意基数的AWS S3存储桶打字稿

时间:2017-01-12 22:35:22

标签: node.js typescript amazon-s3 aws-sdk

我的removeObjects函数让我陷入困境。该函数假设syncronoulsy获取S3存储桶中的对象列表,然后异步删除对象。如果列表被截断,则重复此操作,直到没有其他对象要删除。 (AWS不提供存储桶中对象的总数,而listObjects会提供结果。)

我做错了什么/为什么我的功能不起作用?该解决方案应该利用JS的单线程和异步性质。为了赏金,我希望得到一个特定于该模块的答案。如果您想查看整个模块,git repo是公开的。

export function removeObjects(params: IS3NukeRequest): Promise<S3.Types.DeleteObjectsOutput> {

  const requests: Array<Promise<S3.Types.DeleteObjectsOutput>> = [];
  let isMore;

  do {
    listObjectsSync(params)
      .then((objectList: S3.Types.ListObjectsV2Output) => {
        isMore = objectList.ContinuationToken = objectList.IsTruncated ? objectList.NextContinuationToken : null;
        requests.push(params.Client.deleteObjects(listObjectsV2Output2deleteObjectsRequest(objectList)).promise());
      })
      .catch((err: Error) => { Promise.reject(err); });
  } while (isMore);

  return Promise.all(requests);
}

export async function listObjectsSync(params: IS3NukeRequest): Promise<S3.Types.ListObjectsV2Output> {
  try {
    return await params.Client.listObjectsV2(s3nukeRequest2listObjectsRequest(params)).promise();
  } catch (err) {
    return Promise.reject(err);
  }
}

感谢。

1 个答案:

答案 0 :(得分:0)

问题是listObjectsSync函数返回Promise,因此您需要将其视为异步函数,而不能只使用循环。你需要做的是在你的isMore为真时创建一连串的承诺,我已经使用递归方法完成了它(我不是TS中的专业人员,所以请在使用之前检查代码)。我还没有尝试过代码,但从逻辑上说它应该可以工作:)

 const requests: Array<Promise<S3.Types.DeleteObjectsOutput>> = [];
  function recursive(recursiveParams) {
    return listObjectsSync(recursiveParams).then((objectList: S3.Types.ListObjectsV2Output) => {
        let isMore = objectList.ContinuationToken = objectList.IsTruncated ? objectList.NextContinuationToken : null;
                      requests.push(params.Client.deleteObjects(listObjectsV2Output2deleteObjectsRequest(objectList)).promise());
        if (isMore) {
          //do we need to change params here?
          return recursive(recursiveParams)
        }
        //this is not necessary, just to indicate that we get out of the loop
        return true;    
      });
  }

  return recursive(params).then(() => {
     //we will have all requests here
     return Promise.all(requests);
  });