[英]How to handle errors if an mp3 file is corrupted while scanning through nodejs
我创建了一个函数来获取用户存储驱动器中的 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
导致解析元数据列表的流程停止时,就会出现问题。 我试图将.txt
重命名为.mp3
以重建损坏文件的情况。 我想要的是每当解析特定音乐文件的元数据时,如果发生错误,它只会返回空数组,然后继续搜索其他文件。 该过程完成后,删除具有空对象的数组元素。
我认为您的地图功能中缺少 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
// []
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.