node.js中XML下载后的零字节文件



我目前正在使用以下代码片段来获取Yahoo天气XML文件:

// This script requires request libraries.
// npm install request
var fs = require('fs');
var woeid_array = fs.readFileSync('woeid.txt').toString().split("n");
var grabWeatherFiles = function (array) {
//var http = require('http');
//var fs = require('fs');
array.forEach( 
function(element)  {
    var http = require('http');
    var file_path = 'xml/' + element + '.xml';
    console.log(file_path);
    var file = fs.createWriteStream(file_path);
    var request = http.get('http://weather.yahooapis.com/forecastrss?w=' + element, function(response) {
        response.pipe(file);
    });
});
};
grabWeatherFiles( woeid_array );

此代码片段成功地下载了XML文件。但是,如果我试图读取这些文件,并将XML数据放入字符串中以便对其进行解析,那么这些文件就是0’d out。node.js写得不对吗?这在我的Mac和c9.io上都发生过。任何提示都会很好。我陷入了困境。

您使用了错误的函数。fs.writeFile至少需要三个参数filenamedatacallback。您无法通过管道连接到它。它只是将数据写入文件名,并在完成后执行回调。

您需要的是fs.createWriteStream,它采用路径(除了额外的选项)。它创建了一个可写流,您可以通过管道将其发送到响应中。

这些是我用来做这项工作的步骤,它很有效。在*.js文件所在的同一级别中创建了一个名为xml的文件夹。创建了woeids.txt文件,其中包含来自http://woeid.rosselliot.co.nz/lookup/london

创建了带有路径定义的代码的修改版本,以使用__dirname(对此的有用解释:__dirname和node.js中的./之间有什么区别?)并将代码放入sample.js:

// This script requires request libraries.
// npm install request
var fs = require('fs');
var woeid_array = fs.readFileSync(__dirname + '/woeids.txt').toString().split("n");
var grabWeatherFiles = function (array) {
    array.forEach( 
    function(element)  {
        var http = require('http');
        var file_path = __dirname + '/xml/' + element + '.xml';
        console.log(file_path);
        var file = fs.createWriteStream(file_path);
        var request = http.get('http://weather.yahooapis.com/forecastrss?w=' + element, function(response) {
            response.pipe(file);
        });
    });
};
grabWeatherFiles( woeid_array );

通过终端node sample.js运行它,它用适当的xml文件填充了xml文件夹。

最新更新