如何使用Firebase Admin Node.js SDK列出云存储桶中的目录
解决方案
Firebase 存储底层基于Google Cloud Storage,本身是扁平对象存储,不存在真实的目录实体,所有目录都是基于对象key中的/分隔符虚拟出来的。
调用getFiles时传入delimiter: "/"参数后,目录不会出现在第一个返回值的文件数组中,而是会作为公共前缀,存放在接口返回响应的prefixes字段中。你之前只解构了第一个files参数,所以拿不到目录列表;如果根目录下没有直接存储的文件、全是目录的话,拿到的files数组本身就是空的,就会出现你遇到的返回结果为空的现象。
列根目录下的目录与文件
const bucket = admin.storage().bucket("backups"); // 注意返回值解构:第三个元素是原始接口响应,目录数据在这里 const [files, , apiResponse] = await bucket.getFiles({ prefix: "", delimiter: "/", maxResults: 100 }); // 根目录下的文件 console.log("文件列表:"); files.forEach(file => console.log(file.name)); // 根目录下的目录 console.log("目录列表:"); const directories = apiResponse.prefixes ?? []; directories.forEach(dirPath => console.log(dirPath));
列指定子目录下的目录与文件
如果要查询某个子目录下的内容,prefix参数传入子目录路径,必须以/结尾:
// 例如查询 backups 桶下 2024/backup/ 子目录的内容 const [subFiles, , subRes] = await bucket.getFiles({ prefix: "2024/backup/", delimiter: "/", maxResults: 100 }); // 子目录下的文件 subFiles.forEach(file => console.log(file.name)); // 子目录下的嵌套目录 const subDirectories = subRes.prefixes ?? []; subDirectories.forEach(dirPath => console.log(dirPath));
分页拉取全量目录
当目录下内容超过maxResults配置的数量时,需要用pageToken分页拉取:
let allDirectories = []; let nextPageToken = null; do { const [, , res] = await bucket.getFiles({ prefix: "", delimiter: "/", maxResults: 100, pageToken: nextPageToken }); allDirectories.push(...(res.prefixes ?? [])); nextPageToken = res.nextPageToken; } while (nextPageToken); console.log("根目录全量目录:", allDirectories);
注意点
- 不需要传入
internal_legacy: true参数,这是Firebase控制台内部接口的专用参数,公开Node.js SDK不识别该参数,传入无意义 - 查询子目录时
prefix必须加结尾斜杠,否则会出现匹配结果不准确的问题 - 若返回值中
prefixes为undefined,代表当前查询路径下没有子目录
内容的提问来源于stack exchange,提问作者Code Spirit
相关产品推荐
相关产品推荐

