我正在尝试使用Node.js创建简单的静态文件服务器,即将视频服务视频/ mp4(内容类型),以便通过http下载。
要注意,文件很大(超过100mb)
尝试使用package node-serve,建议用于静态文件服务,但不能满足我的目的(并且看起来使用阻塞读取)。
我的自定义代码确实有效,但是每次请求都会收到内存泄漏,这是10-20次请求之后的 使用以下错误导致进程崩溃: 致命错误:CALL_AND_RETRY_2分配失败 - 处理内存不足
每次刷新都会使node.js的内存占用量增加大约200mb。
在这里查看了大多数有关node.js内存泄漏的答案,没有答案 解决我的问题,因为它似乎有点特定于平台或组合...而且严格来说不是代码错误,也注意到开发人员遇到了这个问题,因为版本0.6以上的node.js ......
还看到声称发生在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 : How to debug "EventEmitter memory leak detected. 11 listeners added"
表示这是nodejs核心中的错误:(
奇怪的是,在我的Windows机器上,它不会发生。 除了安装旧版本v0.8.23之外的任何其他想法 不胜感激..答案 0 :(得分:0)
我实际上在节点0.10.4(Node.js app becomes unresponsive if I reload multiple times in quick succession)上遇到了同样的问题 - 最好的解决方案是升级到0.10.15 - 错误已在新版本中修复。
答案 1 :(得分:0)
我在Windows上有版本0.10.36但仍然会发生:/
答案 2 :(得分:-1)
正如GitHub上的问题所讨论的那样,自节点v0.10.11以来已经修复了这个问题。如果您遇到节点错误,请先尝试更新,看看它是否已经修复。