使用 promise 从 s3 存储桶(min.io 或亚马逊)获取对象列表
Get list of objects from s3 bucket (min.io or amazon) using promise
我正在尝试使用 min.io javascript API (https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2) 从 s3 存储桶中获取对象名称列表。 APIreturns一个流。但是,我总是得到一个空列表。
数据流的例子是:
{
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
}
我的函数
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 必须支持 Promise。
您可以通过执行以下操作来解决此问题:
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);
});
});
我正在尝试使用 min.io javascript API (https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2) 从 s3 存储桶中获取对象名称列表。 APIreturns一个流。但是,我总是得到一个空列表。
数据流的例子是:
{
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
}
我的函数
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 必须支持 Promise。
您可以通过执行以下操作来解决此问题:
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);
});
});