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

时间:2015-12-17 12:37:47

标签: javascript node.js express

标题说明了一切,我试图编写一个利用库requestunzip和{{}的脚本(在nodejs / express服务器端应用程序中运行)。 1}}执行一个任务,包括从给定的URL获取一个zip文件,其内容是一个xml文件,我需要解析它到一个javascript对象进行进一步处理。

到目前为止,我已设法提出:

xml2js

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

  1. 以节省磁盘空间,因为一旦将xml文件转换为js,我真的不需要保留xml文件
  2. 它甚至不起作用: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 */ }); }); }); }); 可能会在fs.readFile完成编写之前开始读取文件,因为行fs.createWriteStream会记录console.log(utils.inspect(obj))(如果我只运行最里面的null块并用先前写入的文件的名称替换fs.readFile,它产生所需的输出)
  3. 我希望我可以为此记下一个jsFiddle,但我对于表达应用程序的方式一无所知。欢呼声。

1 个答案:

答案 0 :(得分:2)

<强> EDITED

管道是不必要的,直接从条目流解析数据:

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 */
                });
            });
        }
    });
});