Javascript Nodejs:wget,解压并转换为js而不写入文件
标题说明了一切,我正在尝试编写一个脚本(在nodejs/express服务器端应用程序中运行),它利用库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(
请求,解压和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))
logsnull
(然而,如果我只运行最里面的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”但到目前为止,这些都不起作用……等一下,我会看一看。我会的,我会在明天这个时候给你回电。现在谢谢。安德烈,我会等待你的回答。当然,为错误感到抱歉。很高兴帮助你。