2014-10-10 84 views
0

在一個NodeJS服務器即時從其他Web服務器定期獲取圖片,並將它們存儲在一個特定的文件夾中。NodeJS - EMFILE異常 - 請求管道writeStream

林與此命令(在一個函數,它由定時器輪詢每10秒)執行此操作:

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

目標圖像文件的名稱被改變,由於「latestCameraPictureNumber」。

我有一個EMFILE異常的麻煩,奇怪的是,這隻發生在服務器上運行的一些Maschines,它似乎只發生在很長一段時間後。

正如我已經發現,這可能意味着即時通訊打開太多的FileStreams或套接字。所以即時通訊不知道如果我的管道做錯了什麼:我必須關閉WriteStream或請求?如何?

文檔說:

readable.pipe(目的地,[選項])#

目的地寫流的目的地將數據寫入

選項對象管選項

端布爾當讀者結束時結束編寫器。默認=真

所以我認爲它會自動關閉。

感謝您的任何幫助。

+0

您是否曾嘗試在請求和文件流中添加一些事件處理程序,以分別檢查它們是否結束和完成?如果他們正在結束/結束,需要多長時間? – mscdex 2014-10-10 12:22:49

回答

0

這個問題似乎更加複雜,我添加了回調函數來確定是否所有的流和請求都正確關閉,它也似乎是由一些其他管道即時通訊使用造成的。 即時通訊使用以下流oerations:

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); 

和IM發送文件到Web客戶端通過

res.sendfile(<path>); 

我在每一個回調函數中都將日誌寫入控制檯,一切看起來都很順利,但到目前爲止,我只能在自己的電腦上測試它,到目前爲止,除了我的一些管道之外,除了我的每臺主機上都會出現異常。 (約10-100)。