有谁知道request模块支持什么事件吗?
发布于 9 年前 作者 tcstory 4618 次浏览 最后一次编辑是 8 年前 来自 问答

模块的地址在这里https://github.com/request/request 问题是这样的,我写了一个zol壁纸下载器,使用async来控制并发,然后通过监听request的error responseend的事件来控制下载的过程 我通过在end事件里调用callback()来通知async图片已经下载好了,并使用pipe()方法来把图片存到本地 通过在error事件里调用callback()来通知async下载过程已经结束 问题在与,在出现网络错误的时候,会依次触发error事件和end事件,导致callback()会被重复调用,这个问题该怎么办呢

部分代码在这里

function downloadImgs(callback, result) {
    if (!fs.existsSync('download_pictures/')) {
        fs.mkdirSync('download_pictures');
    }
    var img_urls = result['get_img_urls'];
    var index = 0;
    console.log('正在下载壁纸....');
    async.eachLimit(img_urls, 5, function (item, callback) {
        var request_stream = request({
            url: item,
            timeout: 5000,
            headers: {
                'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0'
            }
        });
        request_stream.on('error', function (error) {
            console.log('downloadImgs| 下载 ' + item  + '失败| Error: ' + error);
            callback();
        });
        request_stream.on('response', function (response) {
            // 我也不知道有时候response为啥会为空,所以为了避免出现response为空的情况
            // 我使用了事件监听的方式来处理数据
            if (response.statusCode === 404) {
                console.log('downloadImgs| 无效的下载地址 ' + item);
                callback();
            } else {
                request_stream.pipe(fs.createWriteStream('download_pictures/number.jpg'.replace(/number/, index +'')));
                index++;
                // 通过设置end事件监听器,通知async已经完成了pipe方法
            }
        });
        request_stream.on('end', function () {
            callback();
        });
    }, function (error) {
        console.log('所有壁纸下载完毕,请查看download_pictures文件夹');
    })
}
2 回复

这个是报错信息(提示一下,end事件原本会打印字符串end,现在已经被我取消掉了

downloadImgs| 无效的下载地址 http://b.zol-img.com.cn/desk/bizhi/image/6/1366x768/1436945611639.jpg
end
/home/tcstory/WebstormProjects/downloadpics/node_modules/async/lib/async.js:35
            if (called) throw new Error("Callback was already called.");
                              ^
Error: Callback was already called.
    at /home/tcstory/WebstormProjects/downloadpics/node_modules/async/lib/async.js:35:31
    at Request.<anonymous> (/home/tcstory/WebstormProjects/downloadpics/app.js:219:13)
    at Request.emit (events.js:129:20)
    at IncomingMessage.<anonymous> (/home/tcstory/WebstormProjects/downloadpics/node_modules/request/request.js:996:12)
    at IncomingMessage.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickCallback (node.js:355:11)

回到顶部