簡體   English   中英

Node.js不關閉由fs.createReadStream()創建的文件

[英]Node.js not closing files created by fs.createReadStream()

在我的服務器上,每次用戶使用我們的服務時,我們都必須從服務器上為其獲取JSON文件。 我通過在我自己的函數中使用fs.createReadStream()來做到這一點。

function getJSONFromServer(filepath, callback){
    var data = fs.createReadStream(filepath);
    data.on('error', function (error) {
        console.log("Caught", error);
        callback(undefined, error);
    });
    var jsonFile = "";
    data.on('data', function(chunk) {
        jsonFile += chunk;
    });
    data.on('end', function() {
        var jsonData = JSON.parse(jsonFile);
        callback(jsonData);
        data.destroy();
        data.close();
    });
}

這可以完成工作,但是不會關閉與文件的連接。 因此,在讀取1024個文件(服務器上的限制)之后,Node.js將產生錯誤EMFILE, too many open files 然后,我必須殺死我們的Node.js服務器,再次打開它,這將清除“打開的文件”。

我檢查由lsof -i -n -P | grep nodejs打開的文件數量lsof -i -n -P | grep nodejs lsof -i -n -P | grep nodejs 它顯示如下:

nodejs  13707     node   10u  IPv4 1163695      0t0  TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED)
nodejs  13707     node   11u  IPv4 1163697      0t0  TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED)

打開的文件數量最多。

我試過使用graceful-fs。 我嘗試調用stream.destroy()stream.close() ,但是仍然遇到相同的問題。 我的服務器本質上是一個定時炸彈,因為我們獲得了大量穩定的用戶流,並且在連接了如此多的用戶之后,它將停止工作。

另外, ulimit -n [open file amount]不起作用,即使可以,但這也不是長期解決方案,因為我希望文件連接關閉並且無緣無故打開。

我正在使用Node.js版本v0.10.25Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64)和最新版本的graceful-fs如果有幫助!

感謝您的任何幫助,您可以提供。

這一定是我犯過的最愚蠢的錯誤。 無論如何,這就是答案。 我希望我可以避免有人處理此錯誤並幾乎將他們的頭發扯掉。

我正在使用nodejs而不是node運行我的應用程序。 事實證明,如果執行nodejs --version ,它可能會返回一個非常舊的版本,對我來說是v0.10.25 node --versionv5.6.0 顯然,版本的大量增加會解決一些問題,因此我使用node app.js而不是nodejs app.js運行該應用程序, nodejs app.js我再也沒有遇到任何問題。 現在只有6個打開的文件,而隨着時間的流逝我們已經超過了1000個。

媽的,把它從我的胸口拿下來感覺很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM