【问题标题】:Including timeout in Node.js http.get while getting large number of image downloads在获取大量图像下载时在 Node.js http.get 中包含超时
【发布时间】:2016-01-07 20:43:44
【问题描述】:

这是我用来从 URL 下载图像的代码:

http.get(options, function (res) {
    res.on('data', function (data) {
        file.write(data);
    }).on('end', function () {
        file.end();
        console.log(file_name + ' downloaded ');
        cb(null, file.path);
    }).on('error', function (err) {
        console.log("Got error: " + err.message);
        cb(err, null);
    });
});

如何为每个请求添加超时,使其不会一直等待大数据或无响应的响应?

【问题讨论】:

  • 听起来是个好计划。你试过什么?
  • 使用这个:nodejs.org/api/…
  • 但是我应该如何在这里使用响应对象???

标签: http node.js


【解决方案1】:

好的,您的问题至少有两种解决方案。一个简单的:

var request = http.get(options, function (res) {
    // other code goes here
});
request.setTimeout( 10000, function( ) {
    // handle timeout here
});

但可能不够灵活。更高级的:

var timeout_wrapper = function( req ) {
    return function( ) {
        // do some logging, cleaning, etc. depending on req
        req.abort( );
    };
};

var request = http.get(options, function (res) {
    res.on('data', function (data) {
        file.write(data);
        // reset timeout
        clearTimeout( timeout );
        timeout = setTimeout( fn, 10000 );
    }).on('end', function () {
        // clear timeout
        clearTimeout( timeout );
        file.end();
        console.log(file_name + ' downloaded ');
        cb(null, file.path);
    }).on('error', function (err) {
        // clear timeout
        clearTimeout( timeout );
        console.log("Got error: " + err.message);
        cb(err, null);
    });
});

// generate timeout handler
var fn = timeout_wrapper( request );

// set initial timeout
var timeout = setTimeout( fn, 10000 );

【讨论】:

  • 您的高级版代码有误:初始超时设置var timeout = setTimeout( fn, 10000 ); 应该在http.get 回调之外。
  • 第一种方法有什么限制?
  • @Robotbugs 对不起,我很久没看到你的评论了。回答问题:例如,您可能希望根据是否收到数据来更改超时。因此,例如在收到任何数据后,您会延长超时时间。不太可能有人会这样做,但仍有可能。 :)
  • @freakish:你好,虽然已经一年多了,但你的回答对我真的很有帮助。但是,仍然有一个问题我无法自己解决。这是我的例子 jsfiddle.net/oe6freko 。我希望在调用 http.get 的回调之后不调用 req.setTimeout 的回调。在我的示例中,当我处理大量请求时,有时它仍会打印出req.abort is still excuted AFTER response is returned in callback function。在这种情况下你能帮帮我吗?提前致谢。
  • @MrCold ,这是个问题吗?我的理解是它是一个有效的用例,例如。您可能会立即收到 200 响应,但响应的数据非常庞大,以至于 socketTimeout 在读取时过期。一个奇怪的情况可能是超时与“结束”一起触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多