使用jsmediatags时遇到EMFILE错误

时间:2017-04-29 22:21:12

标签: javascript node.js

我使用jsmediatags来读取大量文件的标签(> 20.000)。我的代码抛出一个EMFILE错误(ERROR fs错误:EMFILE:太多打开文件,打开“path-to-file”)因为我超过了打开文件的最大数量。我不能使用graceful-js之类的东西,因为fs内置于模块中。所以我的问题是:如何避免EMFILE错误?

我可以想到两种方法:使用某些东西一次只读取批量数据或以某种方式用graceful-js替换fs依赖。如果有人能指出我正确的方向,那将是非常有帮助的。

var addToDatabase = (files) => {
    for(let i=0;i<files.length;i++){
        if(files[i].endsWith(".mp3")){
            new jsmediatags.Reader(files[i])
            .setTagsToRead(["title", "track", "artist", "album", "year"])
            .read({
                onSuccess: function(tag) {
                    database.insert({path: files[i], title: tag.tags.title, track: tag.tags.track, artist: tag.tags.artist, album: tag.tags.album, year: tag.tags.year});
                },
                onError: function(error) {
                    console.log("ERROR", error.type, error.info, files[i]);
                }
            });
        }
    }
}

require('node-dir').files(_some_dir, function(err, files) {
    if (err) dispatch(rebuildDbRejected("ERROR while reading the database directory"));
    addToDatabase(files);
});

1 个答案:

答案 0 :(得分:0)

我从jsmediatags改变了NodeFileReader,现在它似乎有效。

const fs = require('fs');
//added these lines
var gracefulFs = require('graceful-fs');
gracefulFs.gracefulify(fs);