Nodejs:wget,解压并转换为js而不写入文件
那么标题说明了一切,我试图编写一个脚本(运行在nodejs / express服务器端应用程序),利用库request
, unzip
和xml2js
执行一个任务,包括从给定的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文件的内容正确写入磁盘,但我正在寻找这种方法的替代方法,原因有二:
- 以节省磁盘空间,因为我不需要保留XML文件,一旦它被转换为js
- 它甚至不工作:
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 */ }); }); } }); });