Nodejs:wget,解压并转换为js而不写入文件

那么标题说明了一切,我试图编写一个脚本(运行在nodejs / express服务器端应用程序),利用库requestunzipxml2js执行一个任务,包括从给定的url中获取zip文件,其内容是一个XML文件,我需要parsing一个JavaScript对象的一些进一步处理。

到目前为止,我设法想出了:

 var express = require("express"); var app = express(); /* some init code omitted */ var request = require("request"); var unzip = require("unzip"); var xml2js = require("xml2js"); var parser = new xml2js.Parser(); app.get("/import", function(req, res) { request("http://path.to/file.zip") .pipe(unzip.Parse()) .on("entry", function(entry) { //This is what I'm trying to avoid, which doesn't even work entry.pipe(fs.createWriteStream(entry.path)); fs.readFile(entry.path, function(err, data) { if(err) { return res.status(500).send(err); } parser.parseString(data, function(err, obj) { console.log(util.inspect(obj)); /* further processing of obj */ }); }); }); }); 

虽然xml文件的内容正确写入磁盘,但我正在寻找这种方法的替代方法,原因有二:

  1. 以节省磁盘空间,因为我不需要保留XML文件,一旦它被转换为js
  2. 它甚至不工作: fs.readFile可能在fs.createWriteStream写完之前开始读取文件,因为console.log(utils.inspect(obj))logging为null (而如果我只运行最里面的fs.readFile entry.path文件块并用先前写入文件的名称replaceentry.path ,它会产生所需的输出)

我希望我可以记下一个jsFiddle这个,但我不知道如何,expressjs应用程序。 干杯。

EDITED

pipe道是不必要的,直接从入口streamparsing数据:

 app.get("/import", function(req, res) { request("http://link-top.zip") .pipe(unzip.Parse()) .on("entry", function(entry) { var chunks = []; var res; if(entry.path == 'needed.xml') { entry.on('data', function(data) { chunks.push(data.toString()); }); entry.on('end', function () { res = chunks.join(""); parser.parseString(res, function(err, obj) { console.log(util.inspect(obj)); /* further processing of obj */ }); }); } }); });