Node JS:在JSON上存储音乐元数据

时间:2014-04-06 19:13:38

标签: javascript json node.js metadata

我是Node JS的初学者,我在尝试构建JSON对象时遇到了麻烦。

我找到了一个模块来查找mp3文件的元数据,我想将这些信息存储在JSON obj上。

我的应用程序的行为如下:

  1. 阅读我的“音乐”目录。
  2. 对于目录中的每个文件,提取其信息并将其存储在结构“jsonSong”中。将“jsonSong”推入名为“jsonObj”的结构中。
  3. 制作一个“jsonObj”的console.log来查看结果。
  4. 以下是代码:

    var fs = require('fs');
    var mm = require('musicmetadata');
    
    fs.readdir('./music/', function(err,files) {
        if(err) throw err;
        var jsonObj = {
                        songs: []
                    };
        files.forEach(function(file){
            var jsonSong = { 
                            title:"",
                            artist:"",
                            duration:"",
                            pic:""
                        }
            var parser = new mm(fs.createReadStream('./music/'+file));
            parser.on('title', function(result) {
                jsonSong.title = result;
            });
            parser.on('albumartist', function(result) {
                jsonSong.artist = result;
            });
            parser.on('duration', function(result) {
                jsonSong.duration = result;
            });
            parser.on('picture', function(result) {
                jsonSong.pic = result;
            });
    
            jsonObj.songs.push(jsonSong);
        });
        console.log(jsonObj);
    });
    

    我的问题是“jsonSong”似乎是空的,这是最后一个console.log的结果(我的音乐目录上有3首歌曲,所以我有3个声明结构):

    { songs: 
       [ { title: '', artist: '', duration: '', pic: '' },
         { title: '', artist: '', duration: '', pic: '' },
         { title: '', artist: '', duration: '', pic: '' } ] }
    

    感谢您的时间。

1 个答案:

答案 0 :(得分:0)

在填充数据之前,您必须等待回调执行,您可以使用done事件。

parser.on('done', function (err) {
  console.log(jsonObj);
});