【问题标题】:Reading file metadata in nodejs with ffmetadata and fs returns undefined使用 ffmetadata 和 fs 在 nodejs 中读取文件元数据返回未定义
【发布时间】:2021-02-21 23:23:12
【问题描述】:

我似乎无法做到这一点。我正在尝试通过使用 fs 的文件夹上的循环使用 ffmetadata 读取文件的元数据(标题)。然后我想将这些属性推送到一个名为 files 的对象数组中。如果我将 push 方法放在 ffmetadata 中,它会引发“push is not a function”错误。如果我将 push 方法放在 ffmetadata 外部,但在 readdirSync 内部,则会创建对象,但标题未定义。

我认为我遇到了异步问题或变量范围问题?我在上面放置了几个 Console.logs,并且从元数据返回的代码在本节之后的代码之后返回。

感谢任何帮助。

var path = './AudioFiles/'
var files = [];
var fTitle

//Read list of files
fs.readdirSync(path).forEach((file) => {
    ffmetadata.read(path + file, function(err, data){
        if (err) console.error("Error reading metadata", err);
        else {
            fTitle = data.title
        }
    })
    files.push({name:file.replace('.mp3',''),title:fTitle})
})

这是我收到的:

files = [{name:"myFile1",title:undefined},{name:"myFile2",title:undefined}...]

我期待以下结果:

files = [{name:"myFile1",title:"myFile1Title"},{name:"myFile2",title:"myFile2Title"}...]

【问题讨论】:

    标签: node.js ffmpeg fs


    【解决方案1】:

    万一有人遇到这个,我想通了。这是一个异步问题。

       //Get Metadata
        function getTitles(path, fName){
            return new Promise((resolve) => {
                setTimeout(() => {
                    ffmetadata.read(path + fName, function(err, data){
                        if (err) console.error("Error reading metadata", err);
                        else {
                            resolve({name:fName,title:data.title});
                        }
                    })
                }, 1000);
            });
        }
    
        function getFiles() {
            var path = './AudioFiles/'
            var files = '';
            const promises = [];
            fs.readdirSync(path).forEach((file) => {
                files += file + ',';
            })
            files = files.substring(0,files.length - 1).split(',')
    
             for(i = 0; i < files.length; i++){
                 promises.push(getTitles(path, files[i]))
             }
    
             Promise.all(promises)
                .then((results) => {
                    //Do Stuff Here
                    console.log(results)
                })
                .catch((e) => {
                    //Handle errors here
                });
        }
    
        //Call our function
        getFiles();
        return;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2014-03-13
      • 2020-06-28
      • 2014-04-05
      • 2022-11-24
      • 2015-11-30
      • 2016-04-24
      相关资源
      最近更新 更多