在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
所以我认为它会自动关闭。
感谢您的帮助。
答案 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);
我通过
将文件发送到WebClientres.sendfile(<path>);
我在每个回调函数中都将日志记录到控制台,一切似乎都运行良好,但到目前为止我只能在自己的电脑上测试它,到目前为止的例外仅在每个机器上出现,除了我的一些管道后已完成(约10-100)。