我想删除我的Azure Blob存储中的所有文件。为此,我使用listBlobsSegmented()列出了存储中的所有Blob,然后将结果传递给deleteBlobIfExists()。但是列表BlobsSegment()中的参数blob.name没有正确分配。如何正确获取Blob名称?

这是存储模型:

const blobService = azure.createBlobService(accountName, accessKey, host);
const containerName = 'container';

module.exports.listAll = () => {
    return new Promise(function(resolve, reject) {
        blobService.listBlobsSegmented(containerName, null, function(err, listBlobsResult) {
            if (err) {
                reject(err);
            } else {
                resolve(listBlobsResult);
            }
        });
    });
}

module.exports.delete = (blobName) => {
    return new Promise(function(resolve, reject) {
        blobService.deleteBlobIfExists(containerName, blobName, function(err, result) {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Block blob '${blobName}' deleted` });
            }
        })
    })
}


这就是我使用它们的方式:

const azureStorage = require('./storage-model')

router.get('/listAll', function(req, res) {
    azureStorage.listAll().then((listBlobsResult) => {
        console.log(listBlobsResult);
        res.send(listBlobsResult);
    }).catch((err) => {
        console.log(err);
    });
});

router.get('/deleteAll', function(req, res) {
    azureStorage.listAll().then((listBlobsResult) => {
        var responseBody;
        for (blob in listBlobsResult.entries) {
            azureStorage.delete(blob.name).then((result) => {
                console.log(result);
                responseBody += result;
            }).catch((err) => {
                console.log(err);
            });
        }
        res.send(responseBody);
    }).catch((err) => {
        console.log(err);
    });
})


之后,它给了我错误信息


  ArgumentNullError:函数所需的参数blob
  未定义deleteBlobIfExists


以下是Microsoft的一些参考
deleteBlobIfExists()
listBlobsSegmented()
ListBlobsResult
BlobResult

我发现blob.name仅返回blob索引号,而不返回实际的blob名称。有没有人可以帮助我?谢谢!



这就是listBlobsResult.entries的样子:

[ {previous blob result},
 BlobResult {
    name: 'my_container/some_picture.jpg',
    creationTime: 'Thu, 11 Jul 2019 09:33:20 GMT',
    lastModified: 'Thu, 11 Jul 2019 09:33:20 GMT',
    etag: '0x8D705A4CFCB5528',
    contentLength: '6300930',
    contentSettings:
     { contentType: 'application/octet-stream',
       contentEncoding: '',
       contentLanguage: '',
       contentMD5: 'OyHfg8c3irniQzyhtCBdrw==',
       cacheControl: '',
       contentDisposition: '' },
    blobType: 'BlockBlob',
    lease: { status: 'unlocked', state: 'available' },
    serverEncrypted: 'true' },
 {next blob result},
 ...{many others blob result}]


我所期望的是,我可以使用blob.name从listBlobsResult.entries的迭代中从条目blob获得blob名称。但这给了我迭代的索引。

最佳答案

listBlobsResult.entries的类型为BlobResult[]

而且,for循环有两种类型,人们将它们混合在一起是很常见的。

为...在

for (let index in listBlobsResult.entries) {
    let blob = listBlobsResult.entries[index];

    /* ... do the work */
}


为...的

for (let blob of listBlobsResult.entries) {
    /* ... do the work */
}

10-02 16:43