我正在尝试使用 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 之外的任何想法将不胜感激。