javascript - 如果在通过 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
以重建损坏文件的情况。我想要的是每当解析特定音乐文件的元数据时,如果发生错误,它只会返回空数组,然后继续搜索其他文件。该过程完成后,然后删除具有空对象的数组元素。
解决方案
我认为您在 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
// []
推荐阅读
- visual-studio-code - 如何在 VS Code 时间戳片段中捕获 UTC 而不是本地时间?
- java - spring webclient 负载均衡
- python-3.x - 据我了解,缓冲模式 MPI 不起作用
- mysql - mysql #1241 中的错误 — 操作数必须包含 1 列。我如何提出替代工作请求?
- mysql - 如何使用 ISEMPTY 功能
- http - 使用 POST 方法的错误结果
- typescript - TypeScript 接口不限制属性的数量吗?
- javascript - Django 注册表单中的 Javascript 表单验证
- autodesk-forge - 如何在房间元素内创建房间名称文本?
- html - jpg图像显示问题