2014-03-07 63 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