Node.js获取文件夹及子文件夹MP3路径并修复代码空数组问题
问题分析与修复方案
我帮你排查下代码里的问题,现在返回空数组主要是逻辑完全搞反了,还有几个细节问题需要调整:
核心问题点
- 逻辑倒置:在
fetchmp3函数里,你现在的逻辑是「找到MP3文件就返回空数组,没找到才去解析元数据」,这和你想要的完全相反!应该是找到文件就调用parseMetadata解析,没找到才返回空数组。 - 变量名冲突:你导入了
path模块,但在dirs.forEach的参数里又用了path,这会覆盖全局的path模块引用,后续如果用到path的方法(比如path.basename)会直接报错,建议改成dir作为参数名。 - 正则表达式不严谨:当前的
/\.(mp3)/ig会匹配到类似test.mp3.txt这种文件(只要字符串里包含.mp3就会被匹配),改成/\.(mp3)$/i更准确,$表示匹配字符串结尾,确保只匹配后缀是.mp3的文件;另外g修饰符在同步查找场景下没必要,保留i忽略大小写即可。 - 未定义的
metaData构造函数:代码里使用了new metaData(...),但你没有提供这个构造函数的定义,要确保它已经被正确声明(比如是一个类或者构造函数),否则会抛出ReferenceError。
修正后的完整代码
const find = require('find'); const path = require('path'); const mm = require('music-metadata'); // 先确保metaData构造函数已定义,这里给个示例类,你可以按需调整字段 class metaData { constructor(common, duration, filePath) { this.title = common.title; this.artist = common.artist; this.album = common.album; this.duration = duration; this.filePath = filePath; // 可根据需求添加更多元数据字段 } } async function parseMetadata(files) { const data = files.map(async (file) => { const metadata = await mm.parseFile(file, { duration: true }); return new metaData(metadata.common, metadata.format.duration, file); }); const musicarray = await Promise.all(data); return musicarray; } function fetchmp3(dirs) { let musicfiles = []; // 把参数名从path改成dir,避免覆盖模块引用 dirs.forEach((dir) => { // 优化正则,确保只匹配后缀为mp3的文件 const res = find.fileSync(/\.(mp3)$/i, dir); musicfiles.push(...res); }); // 修正核心逻辑:有文件就解析,无文件返回空数组 if (musicfiles.length > 0) { return parseMetadata(musicfiles); } else { return Promise.resolve([]); } }
修正说明
- 调整了
fetchmp3的核心逻辑,当找到MP3文件时调用parseMetadata解析元数据,无文件时返回空数组; - 修复了变量名冲突问题,避免覆盖
path模块; - 优化了正则表达式,确保只匹配真正的MP3文件;
- 添加了
metaData类的示例实现,你可以根据自己的需求调整字段; - 整理了代码格式,提升可读性(比如添加换行、空格)。
现在你调用fetchmp3(['/your/target/directory'])应该就能正确返回包含元数据的MP3文件数组了。
内容的提问来源于stack exchange,提问作者splintercell9
相关产品推荐
相关产品推荐

