【问题标题】:NodeJS - EMFILE Exception - request piped to writeStreamNodeJS - EMFILE 异常 - 请求通过管道传输到 writeStream
【发布时间】:2014-10-10 11:38:44
【问题描述】:

在 NodeJS 服务器中,我会定期从另一个 WebServer 获取图片并将它们存储在特定文件夹中。

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

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

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

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

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

文档说:

readable.pipe(destination, [options])#

destination Writable Stream 写入数据的目的地

options 对象管道选项

end Boolean 当阅读器结束时结束作者。默认 = 真

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

感谢您的帮助。

【问题讨论】:

  • 您是否尝试向请求和文件流添加一些事件处理程序以分别检查它们是否正在结束和完成?如果他们正在结束/完成,需要多长时间?

标签: javascript node.js


【解决方案1】:

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

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 个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2016-06-14
    • 2016-05-10
    • 2011-01-03
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多