我似乎无法让这个工作。我想将一些数据写入gzip流,然后将gzip流传输到文件写入流。我想在文件写完后再调用一个函数。我目前有:
var gz = zlib.createGzip()
.pipe(fs.createWriteStream(gz_path));
gz.write(data);
gz.on('error', function(err){
console.log("wtf error", err);
});
gz.on('finish', function(){
console.log("write stream is done");
dosomething();
});
永远不会调用finish事件或错误事件。
答案 0 :(得分:1)
试
var zlib = require('zlib');
var stream = require('stream');
var util = require('util');
var fs = require('fs');
var gz = zlib.createGzip();
function StringifyStream(){
stream.Transform.call(this);
this._readableState.objectMode = false;
this._writableState.objectMode = true;
}
util.inherits(StringifyStream, stream.Transform);
StringifyStream.prototype._transform = function(obj, encoding, cb){
this.push(JSON.stringify(obj));
cb();
};
var data = "some data in here";
var rs = new stream.Readable({ objectMode: true });
rs.push(data);
rs.push(null);
rs.pipe(new StringifyStream())
.pipe(gz)
.pipe(fs.createWriteStream('test.gz'))
.on('error', function(err){
console.log("wtf error", err);
})
.on('finish', function(){
console.log("write stream is done");
// dosomething();
});
答案 1 :(得分:1)
管道的顺序可能是问题所在。我能够通过让 createGzip
在 createWriteStream
之前解决这个问题。例如:
import Readable from "stream";
import zlib from "zlib";
import fs from "fs";
Readable.from([data])
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream(`filePath.gzip`))
.on("error", (error) => {
// handle error
})
.on("finish", () => {
// handle success
})
答案 2 :(得分:0)
我的例子:
async function run(){
var zlib = require('zlib');
var fs = require("fs");
var gz = zlib.createGzip();
gz.on('error', function(err){ console.log(err.stack); });
// gz.on('finish', function() { console.log("finished compression, now need to finish writing..."); });
var f = fs.createWriteStream('test.txt.gz');
f.on('error', function(err){ console.log(err.stack); });
f.on('finish', function() { console.log("Write success."); });
gz.pipe(f);
// if stream.write returns false need to wait for drain,
// for example using await for a promise in an async function, or maybe run the callback on drain
if(!gz.write('test','utf-8'))
await new Promise( (resolve,reject)=> gz.once('drain', resolve) )
gz.end();
console.log("Compress zip file success.");
}
run();
问题中的代码有3个问题
// needded for code in question to run:
function dosomething(){
}
var gz_path="test.txt.gz"
var data="test"
//corrected code
var fs = require("fs");
var zlib = require('zlib');
// pipe retuns its argument, the folowing is correct:
// var f = zlib.createGzip().pipe(fs.createWriteStream(gz_path));
var gz = zlib.createGzip();
gz.pipe(fs.createWriteStream(gz_path));
// it helps to setup events before they fire
gz.on('error', function(err){
console.log("wtf error", err);
});
gz.on('finish', function(){
console.log("write stream is done");
dosomething();
});
gz.write(data);
// need to end stream for data to be written
gz.end()