简体   繁体   English

使用 promise 从 s3 存储桶(min.io 或 amazon)中获取对象列表

[英]Get list of objects from s3 bucket (min.io or amazon) using promise

I am trying to get a list of object name from s3 bucket using min.io javascript API ( https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2 ).我正在尝试使用 min.io javascript API ( https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2 ) 从 s3 存储桶中获取对象名称列表。 The API returns a stream. API 返回一个流。 However, I always get an empty list.但是,我总是得到一个空列表。

The example of the dataStream is:数据流的例子是:

{
  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,
  etag: '5021b3b7c402468d5b018a8b4a2b448a',
  size: 10546620
}

My function我的功能

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;
    }

Expected output is a list object name, [sample-mp4-file-1.mp4, sample-mp4-file-2.mp4]预期输出是一个列表对象名称,[sample-mp4-file-1.mp4, sample-mp4-file-2.mp4]

According to the documentation, listObjectsV2() is returning a stream, not a promise.根据文档, listObjectsV2()正在返回一个流,而不是一个承诺。 Therefore, await is returning immediately, before objectsList will contain anything.因此,在objectsList将包含任何内容之前, await立即返回。

The API you're using has to support Promises if you want to await them.如果您想await它们,您正在使用的 API 必须支持 Promise。

You could work around this by doing something like this:您可以通过执行以下操作来解决此问题:

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);
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM