【问题标题】:NodeJS Request filestream EMFILE errorNodeJS请求文件流EMFILE错误
【发布时间】:2014-02-19 15:05:41
【问题描述】:
request.post({url: 'http://service.com/upload', form: {data: fs.createReadStream('T:/a.png')}});

在每秒运行大约 10 分钟后,我收到此错误 Error: EMFILE(打开的文件太多)

为什么?我应该手动关闭这些流吗?为什么request 不这样做,但如果是,我该如何关闭它们?

编辑:我没有进行很多异步调用,一次只有 1 个请求处于活动状态。

编辑:没有任何流被关闭,它在我创建 2046 个流之后就出错了。为什么不关门?

【问题讨论】:

    标签: windows node.js file file-io


    【解决方案1】:

    看,这取决于您要构建的服务类型。

    例如,如果您正在异步执行 fs.createReadStream 多次(例如并行执行数千次),Node.JS 将抛出该错误。

    尝试像这样调试您的应用程序(检查打开的流的数量)。

    var fs = require("fs");
    
    var streams = 0;
    var i;
    
    try {
      for (i=0;i<10000;i++)
      {
        streams++;
        fs.createReadStream('./file.png').once('end',function () { streams--; });
      }
    } catch (e) {
      console.log(streams);
    }
    

    【讨论】:

    • 我没有做很多异步调用,一次只能激活 1 个请求。感谢您提供调试代码,这应该会有所帮助,我会尽快检查。
    • 没有任何流被关闭,它在我创建 2046 个流之后就出错了。为什么request 不关闭它们?
    • ServerResponse 的流由 Node.JS '自动'关闭。您的代码的问题(我认为)是您正在打开文件流而不是在任何地方关闭它们。尝试监听 socket.on('close',function() {}) 并关闭打开的文件流。
    • 什么socket?以及如何关闭流?
    • 来自 http 连接和文件流的套接字。你可以调用 stream.close()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多