Как правильно закрыть поток gzip на веб-сервере NodeJS по Ctrl + C (SIGINT)? - PullRequest
0 голосов
/ 08 мая 2019

Я использовал модуль zlib NodeJS для хранения данных в журнале. Проблема в том, что когда я нажимаю Ctrl + C в своем приложении NodeJS, я не могу заставить модуль zlib правильно завершить поток. Таким образом, после выхода из сервера, если я наберу:

$ zcat test.txt.gz 

Я получаю:

gzip: test.txt.gz: unexpected end of file

Код здесь:

const fs = require('fs');
const http = require('http');
const zlib = require('zlib');
const gzlog = zlib.createGzip();
const gzfile = fs.createWriteStream('test.txt.gz');
gzlog.pipe(gzfile);
process.on('SIGINT', function() {
        console.log("Caught interrupt signal");
        gzfile.on('close', function() {
                console.log('process.exit()');
                process.exit();
        });
        gzfile.on('finish', function() {
                console.log('gzfile on finish');
                gzfile.close();
        });
        gzlog.on('close', function() {
                console.log('gzlog on close');
                gzfile.end();
        });
        gzlog.on('finish', function() {
                console.log('gzlog on finish');
                gzlog.close();
        });
        server.close(function() {
                gzlog.flush(function() {
                        console.log('gzlog on flush');
                        gzlog.end();
                });
        });
});
process.on('exit', function() {
        console.log('exiting');
});
const server = http.createServer(function() {
}).listen(3000);

В чем проблема в моем коде? Что я делаю не так? По крайней мере обработчик SIGINT исключен:

$ node server.js 
^CCaught interrupt signal
gzlog on flush
gzlog on finish
gzlog on close
gzfile on finish
process.exit()
exiting
...