使用Promise

问题描述

我正在尝试使用min.io javascript API(https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2)从s3存储桶中获取对象名称列表。 API返回一个流。但是,我总是得到一个空列表。

dataStream的示例为:

{
  name: 'sample-mp4-file-1.mp4',lastModified: 2020-10-14T02:35:38.308Z,etag: '5021b3b7c402468d5b018a8b4a2b448a',size: 10546620
}
{
  name: 'sample-mp4-file-2.mp4',lastModified: 2020-10-14T15:54:44.672Z,size: 10546620
}

我的功能

public async listFiles(
        bucketName: string,prefix?: string
    ): Promise<string[]> {
        const objectsList = [];
        await minioClient.listObjectsV2(bucketName,"",true,function(
            err,dataStream
        ) {
            if (err) {
                console.log("Error listFiles: ",err);
                return;
            }

            console.log("Succesfully get data");


            dataStream.on("data",function(obj) {
                objectsList.push(obj.name);
            });

            dataStream.on("error",function(e) {
                console.log(e);
            });

            dataStream.on("end",function(e) {
                console.log("Total number of objects: ",objectsList.length);
            });
        });

        return objectsList;
    }

预期输出是列表对象名称[sample-mp4-file-1.mp4,sample-mp4-file-2.mp4]

解决方法

根据文档,listObjectsV2()返回的是流,而不是诺言。因此,await将在objectsList包含任何内容之前立即返回。

您要await使用的API必须支持Promises。

您可以通过执行以下操作来解决此问题:

const objectsList = await new Promise((resolve,reject) => {
  const objectsListTemp = [];
  const stream = minioClient.listObjectsV2(bucketName,'',true,'');
  
  stream.on('data',obj => objectsListTemp.push(obj.name));
  stream.on('error',reject);
  stream.on('end',() => {
    resolve(objectsListTemp);
  });
});