Azure Blob Storage获取容器Blob内容访问blob.name致崩溃如何解决
故障原因
访问blob.name触发崩溃的核心原因是listBlobsFlat()迭代返回的结果不只有Blob对象:当容器内存在虚拟目录结构、或者存储账号开启了ADLS Gen2分层命名空间时,迭代器会同步返回类型为prefix的虚拟目录项,这类项的结构和标准Blob项不一致,直接读取不存在的name属性就会触发运行时错误。
官方文档的基础示例默认演示的是无目录的纯扁平存储场景,没有加类型判断分支,在有层级结构的容器里运行直接就会报错。
修复代码
直接替换原有循环逻辑,增加类型判断即可:
async function listBlobs(blobServiceClient, containerName) { const containerClient = blobServiceClient.getContainerClient(containerName); let blobIndex = 1; const blobIterator = containerClient.listBlobsFlat(); for await (const item of blobIterator) { // 区分返回项类型,只对Blob类型项读取name属性 if (item.kind === "blob") { console.log(`Blob ${blobIndex++}: ${item.name}`); } // 不需要处理虚拟目录的话可以直接忽略下面的分支 else if (item.kind === "prefix") { console.log(`检测到虚拟目录前缀: ${item.prefix}`); } } }
额外排查项
- 确认本地安装的
@azure/storage-blobSDK为v12+稳定版本,v10及更早版本的返回字段结构和v12版本完全不兼容,跨版本照搬示例代码必然出现字段不存在问题 - 如果运行后还是报错,可以在循环最开始加
console.log(item)打印单条返回项的完整结构,对照实际字段调整读取逻辑即可 - 开启了分层命名空间的存储账号建议将SDK升级到最新稳定版,旧版本SDK对Gen2账号的兼容存在已知问题
内容的提问来源于stack exchange,提问作者L1ghtboro
相关产品推荐
相关产品推荐

