Javascript NodeJS:WriteStream close事件在承诺被拒绝后运行
我使用以下代码从网站下载图像。有时,如果出现错误,网站将返回HTML页面而不是图像。为了避免下载HTML页面而不是图像,当我收到响应头时,如果内容类型是HTML,我拒绝下载功能。当我在响应事件中拒绝我的函数时,我的拒绝在下载函数之外成功处理。但是,下载函数即使在被拒绝后仍将继续运行(就好像返回被忽略一样),最终将在writeStream的end事件中运行代码 如何阻止下载功能在被拒绝后继续运行Javascript NodeJS:WriteStream close事件在承诺被拒绝后运行,javascript,node.js,Javascript,Node.js,我使用以下代码从网站下载图像。有时,如果出现错误,网站将返回HTML页面而不是图像。为了避免下载HTML页面而不是图像,当我收到响应头时,如果内容类型是HTML,我拒绝下载功能。当我在响应事件中拒绝我的函数时,我的拒绝在下载函数之外成功处理。但是,下载函数即使在被拒绝后仍将继续运行(就好像返回被忽略一样),最终将在writeStream的end事件中运行代码 如何阻止下载功能在被拒绝后继续运行 const fs = require('fs-extra'); const request = req
const fs = require('fs-extra');
const request = require('request');
var probe = require('probe-image-size');
var progress = require('request-progress');
var filename = 'C:/Users/User/Desktop/myimage.jpg';
var writeSteam = fs.createWriteStream(filename)
var req = request(createRequestHeaders('www.linktomyimage.com/image.jpg'));
downloadImage(req, filename).then((fileInfo) => {
console.log('Successfully downloaded.');
}).catch((error) => {
console.log('Handle rejections and do something else.');
});
function createRequestHeaders(url) {
var cookie = `userid=${userid}; phash=${phash};`;
return {
'url': url,
'method': 'GET',
'gzip': true,
'headers': {
'Referer': `https://${website}/`,
'Cookie': cookie
}
};
}
function downloadImage(req, filename) {
return new Promise((resolve, reject) => {
var response = null;
var bytes;
var dirname = path.dirname(filename);
if (!fs.existsSync(dirname)) fs.ensureDirSync(dirname);
progress(req, { delay: 0 }).on('progress', function (state) {
updateDownloadSpeed(state.speed);
}).on('end', function () {
writeSteam.on('close', () => {
if (bytes !== writeSteam.bytesWritten) {
// Here the write stream is closed, so we can compare the property bytesWritten with the bytes we expected to receive
console.log('The size is not equal! Image is corrupt!')
reject({ 'name': 'ImageCorrupt' });
return;
} else if (response.statusCode === 200) {
var input = require('fs').createReadStream(filename);
probe(input).then(result => {
input.destroy();
if (result != null) {
resolve({
bytes: bytes, width: result.width,
height: result.height,
});
} else {
reject({ 'name': 'ImageMissingOrCorrupt' });
return;
}
}).catch((error) => {
reject(error);
return;
});
} else {
// This is never triggered when the download stops and the image is truncated
reject({ 'name': 'StatusCodeError', 'message': response.statusCode });
return;
}
});
}).on('response', function (resp) {
response = resp;
if (mime.getExtension(response.headers['content-type']) == 'html') {
// Even if this is triggered and the Promise rejects, the code under the writeStream's close event still triggers
reject({ 'name': 'RecievedHTML' });
return;
} else {
// Get the expected size of the file so we can test if it is entirely downloaded later
bytes = parseInt(response.headers['content-length']);
}
}).on('error', function (error) {
reject(error);
return;
}).pipe(writeSteam);
});
}
因为您在没有任何条件的情况下调用
管道
从底部卸下管道(writeStream)
,并将其放置在else
块中:
if(mime.getExtension(response.headers['content-type'])=='html'){
//即使这被触发并且承诺被拒绝,writeStream的close事件下的代码仍然会触发
拒绝({'name':'receivedhtml'});
返回;
}否则{
//获取文件的预期大小,以便我们可以测试它是否在以后完全下载
bytes=parseInt(response.headers['content-length']);
此.pipe(writeStream);
}
如果出现问题并触发请求的错误事件,该怎么办?writeStream end事件还会触发吗?我认为如果在请求过程中发生错误,那么根本不会发出响应事件,因此writeStream
甚至不会启动。