Cũng tiêu đề nói tất cả, tôi đang cố gắng viết một tập lệnh (chạy trong ứng dụng phía máy chủ nodejs/express) sử dụng thư viện request
, unzip
và xml2js
để thực hiện tác vụ bao gồm tìm nạp tệp zip từ url đã cho, nội dung của nó là tệp xml mà tôi cần phân tích cú pháp đối tượng javascript để xử lý thêm.Nodejs: wget, giải nén và chuyển thành js mà không cần ghi vào tập tin
Cho đến nay tôi đã quản lý để đưa ra:
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 */
});
});
});
});
Tuy có một thực tế các nội dung của file xml được ghi chính xác vào đĩa, Tôi đang tìm kiếm một sự thay thế cho phương pháp này vì hai lý do :
- để tiết kiệm không gian đĩa, vì tôi không thực sự cần để giữ cho các tập tin xml nào một khi nó đã được chuyển đổi sang js
- nó thậm chí không hoạt động:
fs.readFile
lẽ bắt đầu đọc các tập tin trước khifs.createWriteStream
được thực hiện bằng văn bản nó, bởi vì dòngconsole.log(utils.inspect(obj))
bản ghinull
(trong khi nếu tôi chạy chỉ trong cùngfs.readFile
khối và thay thếentry.path
với tên của tập tin bằng văn bản trước đó, nó tạo ra các đầu ra mong muốn)
Tôi ước gì tôi có thể jot xuống một jsFiddle cho điều này nhưng tôi không biết làm thế nào, khi nói đến các ứng dụng expressjs. Chúc mừng.
Về ** 2 **: 'fs.createWriteStream (entry.path)' trả về một dòng Writable , có sự kiện ['kết thúc'] (https://nodejs.org/api/stream.html#stream_event_finish). Bạn có thể bắt đầu fs.readFile khi writeStream đã viết xong. – leroydev