最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Node.js how to pipe gzip stream to writestream - Stack Overflow

programmeradmin4浏览0评论

I can't seem to get this to work. I want to write some data to a gzip stream and then pipe the gzip stream to a file write stream. I want to then call a function when the files done writing. I currently have:

  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();
  });

The finish event or the error event is never called.

I can't seem to get this to work. I want to write some data to a gzip stream and then pipe the gzip stream to a file write stream. I want to then call a function when the files done writing. I currently have:

  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();
  });

The finish event or the error event is never called.

Share Improve this question edited Apr 16, 2022 at 19:20 Yilmaz 49.5k18 gold badges214 silver badges268 bronze badges asked Aug 19, 2014 at 22:21 kevzettlerkevzettler 5,21315 gold badges60 silver badges110 bronze badges 1
  • 4 Try closing the gz stream with end() after finished writing. – user568109 Commented Aug 19, 2014 at 23:33
Add a ment  | 

4 Answers 4

Reset to default 3

my example:

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 pression, 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();

the code in the question had 3 problems

  • pipe returns its argument, not the called-on object
  • need to end the stream, so it will write the data to output
  • better to set up events before they are used

// 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()

from here

import { createReadStream, createWriteStream } from 'fs'
import { createGzip } from 'zlib'

const filename = yourFile
// opens the file as a readable stream
createReadStream(filename)
   .pipe(createGzip())
   .pipe(createWriteStream(`${filename}.gz`))
   .on('finish', () => console.log('File is pressed'))

try

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();
});

The order of pipes might be the problem. I was able to resolve this by letting createGzip before createWriteStream. For example:

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
   })
发布评论

评论列表(0)

  1. 暂无评论