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

Javascript Nodejs:wget,解压并转换为js而不写入文件,javascript,node.js,express,Javascript,Node.js,Express,标题说明了一切,我正在尝试编写一个脚本(在nodejs/express服务器端应用程序中运行),它利用库请求,解压和xml2js执行一项任务,包括从给定url获取zip文件,其内容是一个xml文件,我需要将其解析为javascript对象以进行进一步处理 到目前为止,我已经设法想出了: var express = require("express"); var app = express(); /* some init code omitted */ var request = require(

标题说明了一切,我正在尝试编写一个脚本(在nodejs/express服务器端应用程序中运行),它利用库
请求
解压
xml2js
执行一项任务,包括从给定url获取zip文件,其内容是一个xml文件,我需要将其解析为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))
    logs
    null
    (然而,如果我只运行最里面的
    fs.readFile
    块,并用以前编写的文件名替换
    entry.path
    ,它将生成所需的输出)

  • 我希望我能为此草草记下一个JSFIDEL,但对于如何使用expressjs应用程序。干杯。

    编辑

    不需要管道,直接从入口流解析数据:

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

    关于2:
    fs.createWriteStream(entry.path)
    返回一个可写流,该流具有一个。您可以在writeStream完成写入后启动fs.readFile。这是一个有效的答案,但不幸的是
    entry.on(“data”,fn)
    事件处理程序被多次调用,每个处理程序都有一个无法作为js对象解析的数据块。我需要全部内容;我可以将不同的块连接成一个字符串传递给
    解析器。parseString
    但是我仍然需要某种事件来确定何时没有更多的块可以连接。
    解压库几乎没有文档记录,所以我找不到表示条目完成的事件的名称,我尝试使用“end”、“finish”、“complete”但到目前为止,这些都不起作用……等一下,我会看一看。我会的,我会在明天这个时候给你回电。现在谢谢。安德烈,我会等待你的回答。当然,为错误感到抱歉。很高兴帮助你。