Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:WriteStream close事件在承诺被拒绝后运行_Javascript_Node.js - Fatal编程技术网

Javascript NodeJS:WriteStream close事件在承诺被拒绝后运行

Javascript NodeJS:WriteStream close事件在承诺被拒绝后运行,javascript,node.js,Javascript,Node.js,我使用以下代码从网站下载图像。有时,如果出现错误,网站将返回HTML页面而不是图像。为了避免下载HTML页面而不是图像,当我收到响应头时,如果内容类型是HTML,我拒绝下载功能。当我在响应事件中拒绝我的函数时,我的拒绝在下载函数之外成功处理。但是,下载函数即使在被拒绝后仍将继续运行(就好像返回被忽略一样),最终将在writeStream的end事件中运行代码 如何阻止下载功能在被拒绝后继续运行 const fs = require('fs-extra'); const request = req

我使用以下代码从网站下载图像。有时,如果出现错误,网站将返回HTML页面而不是图像。为了避免下载HTML页面而不是图像,当我收到响应头时,如果内容类型是HTML,我拒绝下载功能。当我在响应事件中拒绝我的函数时,我的拒绝在下载函数之外成功处理。但是,下载函数即使在被拒绝后仍将继续运行(就好像返回被忽略一样),最终将在writeStream的end事件中运行代码

如何阻止下载功能在被拒绝后继续运行

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
甚至不会启动。