NodeJS - EMFILE异常 - 请求管道写入writeStream

时间:2014-10-10 11:38:44

标签: javascript node.js

在NodeJS Server中定期从其他WebServer获取图片并将其存储在特定文件夹中。

我使用此命令执行此操作(在每10秒钟由计时器轮询的函数中):

request(cameraRequestOptions).pipe(fs.createWriteStream("./campics/cam" + cameraId + "pic" + latestCameraPictureNumber + ".jpg"));

由于“latestCameraPictureNumber”,目标图像文件的名称正在改变。

我遇到了EMFILE异常问题,奇怪的是这只发生在服务器上运行的一些Maschines上,而且似乎只是在很长一段时间后发生。

正如我已经发现的,这可能意味着我打开了太多的FileStreams或Sockets。所以我不确定我的管道是否有问题:我是否必须关闭WriteStream或请求?怎么样?

文档说:

  

readable.pipe(destination,[options])#

     

destination Writable Stream写入数据的目的地

     

选项对象管道选项

     

end Boolean读者结束时结束编写器。默认= true

所以我认为它会自动关闭。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题似乎更复杂,我添加了回调函数来确定所有流和请求是否正确关闭,似乎问题是由我正在使用的其他一些管道引起的。 我正在使用以下流程:

var fsCTmp = fs.createWriteStream("./campics/" + newLogId + "cam"+camId+"pic" + picNum + ".jpg");
fsCTmp.on('finish', wscfTest);
fs.createReadStream("./campics/cam"+camId+"pic" + picNum + ".jpg").pipe(fsCTmp).on('finish', rsfTest);

var fsCP = fs.createWriteStream("./campics/cam" + cameraId + "pic" + latestCameraPictureNumber + ".jpg");
fsCP.on('finish', wsftest);
request(cameraRequestOptions).pipe(fsCP).on('finish', rftest);

var fsWTmp = fs.createWriteStream("./campics/" + activeAlarmPicturesToAddToLog[j].logId + "cam"+cameraId+"pic" + activeAlarmPicturesToAddToLog[j].picNum + ".jpg");
fsWTmp.on('finish', wscfTest);
fs.createReadStream(picturePath).pipe(fsWTmp).on('finish', rsfTest);

我通过

将文件发送到WebClient
res.sendfile(<path>);

我在每个回调函数中都将日志记录到控制台,一切似乎都运行良好,但到目前为止我只能在自己的电脑上测试它,到目前为止的例外仅在每个机器上出现,除了我的一些管道后已完成(约10-100)。