【问题标题】:Error: EMFILE: too many open files错误:EMFILE:打开的文件太多
【发布时间】:2015-06-14 14:50:23
【问题描述】:

使用 nw.js,我只是想将图像保存在具有不同随机名称的 img 元素数组中。

但是有一些错误,是我的代码有问题吗?

for (i = 0; i < imgs.length; i++) {
 request(imgs[i].getAttribute('src')).on('error', function(err) {
  throw err
 }).pipe(fs.createWriteStream('data/imgs/' + randomString))
}

imgs[] 是一个包含 100-500 个 html img 元素的数组,但我正在接收

Error: EMFILE: too many open files, open *<directory>*

还有一个错误:

"Uncaught Error: socket hang up"

虽然它保存了一些图像,但其中一些已损坏,并且它创建的图像比实际数量多。

【问题讨论】:

    标签: javascript node.js request npm


    【解决方案1】:

    使用graceful-fs 模块,它是fs 模块的直接替代品。它是原生 fs 模块的包装器。引用docs of graceful-fs module

    openreaddir 调用排队,如果由于文件描述符过多而出现EMFILE 错误,则在关闭某项时重试它们。

    由于它公开了与原生 fs 模块相同的 API,因此您可以像使用普通的 fs 模块一样使用它。

    // use just like fs
    var fs = require('graceful-fs');
    

    注意:此库由 Node.js 的核心开发人员之一 Isaac Z. Schlueter 创建。

    【讨论】:

      【解决方案2】:

      另一个简单的解决方案是等待文件被下载,然后才使用递归打开新请求:

      var fs = require('fs');
      var request = require('request');
      
      var dest = '../data/downloads/';
      
      function _saveAllFiles (fileUrlArray, curIdx, options) {
          try {
              var count = fileUrlArray.length - 1;
              var curFile = fileUrlArray[curIdx];
      
              var stream = request(curFile)
                  .pipe(fs.createWriteStream(dest + "file_" + curIdx));
      
              stream.on('finish', function () {
                  console.log("Downloaded", curFile);
                  stream.close();
                  if (curIdx + 1 < count) {
                      //Finished, download next file
                      _saveAllFiles(fileArray, curIdx + 1, options);
                  }
              });
              stream.on('error', function () {
                  console.log("Error", curFile);
                  stream.close();
                  stream.end();
                  if (curIdx + 1 < count) {
                      //Error occured, go to next file
                      _saveAllFiles(fileArray, curIdx + 1, options);
                  }
              });
          } catch (err) {
              console.error("Failed to download file", err);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多