【发布时间】:2019-11-21 19:34:01
【问题描述】:
我想删除我的 azure blob 存储中的所有文件。为此,我使用 listBlobsSegmented() 列出存储中的所有 blob,然后将结果传递给 deleteBlobIfExists()。但是 list 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 名称。但它给了我迭代索引。
【问题讨论】:
-
如果要删除所有 blob,为什么不直接删除 blob 容器?
-
你试过
listBlobs()而不是listBlobsSegmented()吗? -
@GauravMantri Beacuase 我想保留容器。但也许先删除容器而不是使用 createContainerIfNotExists() 将是一个很好的备份计划,谢谢!
-
@Neverever 我确保来自 listBlobs() 和 listBlobsSegmented() 的 listBlobsResult 都是正确的。稍后我将编辑问题以公开 listBlobsResult。顺便说一句,listBlobs() 似乎只在较旧的 SDK 中实现,而不是较新的 SDK,我正在使用新的。
标签: javascript node.js azure blob azure-storage