2014-03-07 81 views
1

我想在每個部署上更新一個browsers.json文件。NodeJS請求和錯誤處理

如果更新文件的請求失敗,我想保持原文件不變。

這是一個很好的方式來做到這一點,或者是否有「更好的做法」?

var http = require('http'); 
var fs = require('fs'); 
var url = 'http://saucelabs.com/rest/v1/info/browsers/webdriver'; 

if (fs.existsSync('browsers.json')){ 
    var browsers = JSON.parse(fs.readFileSync('browsers.json')); 
} 

http.get(url, function (res) { 
    var data = ''; 

    res.on('data', function (chunk) { 
     data += chunk; 
    }); 

    res.on('end', function() { 
     var obj = JSON.parse(data); 
     fs.writeFile('browsers.json', data, function (err) { 
      if (err) throw err; 
     }); 
    }) 

}).on("error", function() { 
    fs.writeFile('browsers.json', browsers, function (err) { 
     if (err) throw err; 
    }); 
}); 
+0

「如果發生更新文件的請求,我想保持原始文件不變。」你什麼意思?你的意思是如果文件已經存在,什麼都不做? – Brad

+0

@Brad,我的意思是_fails_,對不起。糾正。我的意思是如果請求失敗,我不想重新編寫瀏覽器文件。 – Sergio

回答

1

我會說錯誤,你不應該寫任何東西。我還會說,通常最好是將響應直接傳遞給文件上的可寫流,以便不會緩存內存中的所有內容。 (雖然如果你的文件很小,這可能並不重要。)

最後,不要忘記一旦擁有它就重新解析和加載數據。

+0

感謝Brad,我重新解析並將數據加載到單獨的文件中,這將在packager.json腳本中運行。我不是那麼和節點「在家」,所以我問:如果在http.get()中有一個錯誤,那麼'res.on('end''執行在所有? – Sergio

+0

@Sergio是的,如果你有一個響應流,那麼'end'總是會在某個時候觸發。另外,一定要檢查你的響應狀態碼,以確保你有一個'200'。 – Brad