You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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([]);
  }
}

修正说明

  1. 调整了fetchmp3的核心逻辑,当找到MP3文件时调用parseMetadata解析元数据,无文件时返回空数组;
  2. 修复了变量名冲突问题,避免覆盖path模块;
  3. 优化了正则表达式,确保只匹配真正的MP3文件;
  4. 添加了metaData类的示例实现,你可以根据自己的需求调整字段;
  5. 整理了代码格式,提升可读性(比如添加换行、空格)。

现在你调用fetchmp3(['/your/target/directory'])应该就能正确返回包含元数据的MP3文件数组了。

内容的提问来源于stack exchange,提问作者splintercell9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:42:30