首页 > 解决方案 > 如果在通过 nodejs 扫描时 mp3 文件损坏,如何处理错误

问题描述

我创建了一个函数来获取用户存储驱动器内的 mp3 文件,该文件采用需要搜索的目录数组。在接收到数组中音乐文件的完整列表后,我将其用作另一个函数中的参数,该函数获取它的元数据(使用音乐元数据)。到目前为止,当没有文件时我的代码运行良好,否则它返回空数组和包含其元数据的对象数组。这是我的代码:

const find = require('find') ;
const mm = require('music-metadata') ;
const directories = ["C:\\Users\\{UserNamehere}\\Music\\"] // you can add more directories
async function parseMetadata(files){
   let metadata ;
   data = files.map(async (file) => {
      metadata = await mm.parseFile(file,{duration:true}) ;

      m = metadata.common ;
      return m ;
   }) ;

   const musicarray = await Promise.all(data) ;
   return musicarray ;
}


function fetchNewSongs(dirs){
   let res,musicfiles = [] ;
   
   dirs.forEach((path)=>{
      res = find.fileSync(/\.mp3/i,path) ;
      musicfiles.push(...res) ;
   });

   if (musicfiles.length !== 0){
      return parseMetadata(musicfiles) ;
   }
   else{
      return Promise.resolve([]) ;
   }
}


fetchNewSongs(directories).then( value => {
   console.log(value)
})

music-metadata当任何音乐文件损坏或通过导致解析元数据列表的流程停止而无法获取其元数据时,就会出现问题。我试图将 a 重命名.txt.mp3以重建损坏文件的情况。我想要的是每当解析特定音乐文件的元数据时,如果发生错误,它只会返回空数组,然后继续搜索其他文件。该过程完成后,然后删除具有空对象的数组元素。

标签: javascriptnode.js

解决方案


我认为您在 map 函数中缺少 try/catch :

模拟版:

const mm = {
  parseFile(file) {
    return Promise.reject("Bad format");
  },
};

async function parseMetadata(files) {
  let metadata = files.map(async (file) => {
    try {
      metadata = await mm.parseFile(file, { duration: true });
    } catch (error) {
      return [];
    }

    m = metadata.common;
    return m;
  });

  return Promise.all(metadata);
}

async function fetchNewSongs(dirs = ["foo", "bar", "baz"]) {
  return parseMetadata(dirs);
}

fetchNewSongs().then(console.log, console.error);

// output : [ [], [], [] ]

作为补充,您可能会进行for循环并避免事后过滤您的数组

const mm = {
  parseFile(file) {
    return Promise.reject("Bad format");
  },
};

async function parseMetadata(files) {
  const metadataCollection = [];
  for (const file of files) {
    try {
      const metadata = await mm.parseFile(file, { duration: true });
      metadataCollection.push(metadata);
    } catch (error) {
      console.warn(error);
    }
  }
  return metadataCollection;
}

async function fetchNewSongs(dirs = ["foo", "bar", "baz"]) {
  return parseMetadata(dirs);
}

fetchNewSongs().then(console.log, console.error);

// outputs:
// Bad format
// Bad format
// Bad format
// []

推荐阅读