0

我正在尝试使用 Node.js 创建简单的静态文件服务器,即将视频作为视频/mp4(内容类型)提供,以便通过 http 下载。

需要注意的是,文件很大(超过 100mb)

尝试使用推荐用于静态文件服务但不符合我的目的的包 node-serve(并且看起来正在使用阻塞读取)。

我的自定义代码确实有效,但每个请求都会发生内存泄漏,在 10-20 次请求后,进程崩溃并出现以下错误:FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

每次刷新都会使 node.js 的内存占用增加约 200mb。

在这里查看了关于 node.js 内存泄漏的大多数答案,没有一个答案能解决我的问题,因为它似乎是特定于平台或组合的......而且严格来说不是代码错误,还注意到了开发人员的经验这个问题从 node.js 的 0.6+ 版本开始......

还看到声称它发生在 Express 上的帖子(https://npmjs.org/package/express

使用的代码:

var fs = require('fs');
var http = require('http');
var mediaPath = '/mypublicdir';


function error404(res) {
    res.writeHead(404,{'content-type':'text/plain'});
    res.end();
} 

function err(str) {
    console.log(str);
}

var server = http.createServer(function (req,res){

  var filename,readStream;


  filename = mediaPath+req.url
  if (fs.existsSync(filename)) {
    readStream = fs.createReadStream(filename, {
        'flags': 'r',
            'mode': 0666,
            //'encoding': 'binary',
            'bufferSize': 8 * 1024      
    });

  } else {

    return;

  }

  readStream.on('data',function(data){
    res.write(data);
  });   

  readStream.on('open',function(data){
    console.log('Stream Open');
    res.writeHead(200,{'content-type':contentTypeSelector('video'),
    'Content-Transfer-Encoding' : 'binary',
    'Transfer-Encoding' : 'chunked'
    });
  });

  readStream.on('error',function(e){
    error404(res);
    err('Stream Read Error',{request:collectRequestMeta(req),filename:filename,error:e});
  });

  readStream.on('end',function(data){
  });

});


server.listen(8080);

每个请求的完整警告:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:160:15)
    at Socket.Readable.on (_stream_readable.js:653:33)
    at Socket.EventEmitter.once (events.js:179:8)
    at TCP.onread (net.js:527:26)

在写这篇文章时,我发现了以下问题: NodeJS:如何调试“检测到 EventEmitter 内存泄漏。添加了 11 个侦听器”

这表明这是nodejs核心中的一个错误:(

奇怪的是,在我的 Windows 机器上,它没有发生。除了安装旧版 v0.8.23 之外的任何想法将不胜感激。

4

3 回答 3

0

实际上,我在节点 0.10.4 上遇到了同样的问题(如果我快速连续多次重新加载,Node.js 应用程序会变得无响应) - 最好的解决方案是升级到 0.10.15 - 该错误已在较新版本中得到修复。

于 2013-07-31T14:06:39.917 回答
0

我在 Windows 上有 0.10.36 版本,但仍然发生:/

于 2015-03-06T00:08:52.000 回答
-1

正如 GitHub 上的问题中所讨论的,自节点 v0.10.11 以来已修复此问题。如果您遇到节点错误,请先尝试更新以查看是否已修复。

于 2013-07-31T14:12:12.700 回答