如何捕获 node.js 中的 zlib 错误
How do I catch zlib errors in node.js
我正在从可能被压缩的服务器下载内容,因此我使用了我在不同地方找到的样板文件:
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)
异常未被 "error" 事件处理程序捕获。那么我该如何捕获它,以便我可以正确清理文件并知道重试?
您有与请求相关的错误处理程序,但没有与解压缩和保存文件相关的错误处理程序。
尝试捕获解压流中的错误:
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
我正在从可能被压缩的服务器下载内容,因此我使用了我在不同地方找到的样板文件:
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)
异常未被 "error" 事件处理程序捕获。那么我该如何捕获它,以便我可以正确清理文件并知道重试?
您有与请求相关的错误处理程序,但没有与解压缩和保存文件相关的错误处理程序。 尝试捕获解压流中的错误:
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