Node.js获取Azure Blob容器文件名列表返回空数组问题求助
问题分析与解决方案:Azure Blob文件名列表返回空数组
你遇到的问题出在遍历blob对象的逻辑错误上,我来帮你拆解问题点,再给出修正后的代码:
错误点解析
- 错误的条件判断:你写的
if (blobsJSON[i] == "name")是把整个blob对象(比如{"name": "xxx", ...})和字符串"name"做比较,这永远不会成立,所以blobsArr.push()根本不会执行。 - 未定义的变量:代码里用了
blobsJSON[i][key],但key变量从来没有被定义过,即使条件成立,这里也会报错。 - 冗余的嵌套循环:每个blob对象已经明确有
name属性,不需要用for-in遍历所有属性来找它。
修正后的代码
我们可以用更简洁的数组map方法直接提取文件名,或者修正原来的循环逻辑:
方法1:使用数组map(推荐,更简洁)
listContainerBlobs = async (blobDirName) => { return new Promise((resolve, reject) => { const blobService = azureStorage.createBlobService(azureStorageConfig.accountName, azureStorageConfig.accountKey); blobService.listBlobsSegmentedWithPrefix(`${azureStorageConfig.containerName}`, `${blobDirName}`, null, (err, data) => { if (err) { reject(err); } else { // 直接从每个blob对象中提取name属性,生成数组 const blobsArr = data.entries.map(blob => blob.name); resolve({ blobsArr }); } }); }); };
方法2:修正原有的for循环
如果你更习惯用传统的for循环,也可以改成这样:
listContainerBlobs = async (blobDirName) => { return new Promise((resolve, reject) => { const blobService = azureStorage.createBlobService(azureStorageConfig.accountName, azureStorageConfig.accountKey); blobService.listBlobsSegmentedWithPrefix(`${azureStorageConfig.containerName}`, `${blobDirName}`, null, (err, data) => { if (err) { reject(err); } else { const blobsArr = []; const blobsJSON = data.entries; for(let i = 0; i < blobsJSON.length; i++){ // 直接访问每个blob对象的name属性 blobsArr.push(blobsJSON[i].name); } resolve({ blobsArr }); } }); }); };
验证结果
用修正后的代码,你会得到预期的文件名数组:
["WKRVAR000241/site_inst_files/avatar002.png"]
这样你就可以把这个数组传入删除、下载等后续方法中使用了。
内容的提问来源于stack exchange,提问作者Octo
相关产品推荐
相关产品推荐

