如何在node.js中捕获zlib错误

时间:2016-02-16 17:23:27

标签: node.js exception-handling zlib

我从可能被压缩的服务器下载内容,所以我使用了我在不同地方找到的样板:

    var file = fs.createWriteStream(filename);
    var request = https.get(url, function(response) {
        switch (response.headers['content-encoding']) {
        case 'gzip':
            response.pipe(zlib.createGunzip()).pipe(file);
            break;
        case 'deflate':
            response.pipe(zlib.createInflate()).pipe(file);
            break;
        default:
            response.pipe(file);
            break;
        }
        file.on('finish', function() {
            console.log("Done: "+url);
            file.close(function() {});
        });
    }).on('error', function(err) { // Handle errors
        fs.unlink(filename, function() {});
        console.log(err+" "+url);
    });

麻烦的是,如果HTTPS请求因网络错误而失败,我有时会抛出此异常:

Error: unexpected end of file
  at Zlib._handle.onerror (zlib.js:363:17)

该例外没有被“#34;错误"事件处理程序那我怎么抓住它,所以我可以正确清理文件并知道再试一次?

1 个答案:

答案 0 :(得分:3)

您有与请求相关的错误的处理程序,但不包含与解压缩和保存文件相关的错误。 尝试捕获解压缩流中的错误:

var decompressed;
switch (response.headers['content-encoding']) {
case 'gzip':
    decompressed = response.pipe(zlib.createGunzip());
    break;
case 'deflate':
    decompressed = response.pipe(zlib.createInflate());
    break;
default:
    decompressed = response;
    break;
}
decompressed.on('error', function(err) {
    // handle error
});
decompressed.pipe(file);

如需更多阅读,请按照此回答 - Error handling with node.js streams