1

I've noticed some websites don't close 302 redirects which causes the callback not to fire.

Anyone know how to remedy this?

var request = require('request');

request({url:'http://craigslist.org' }, function (error, response, body)
{
    console.log("Callback Never Runs. ");
});
4

2 回答 2

0

抱歉,经过进一步调查,此建议也失败了。但是当你的代码多次尝试时,偶尔也会起作用。我想出的最好的方法是使用超时重试。timeout 触发完成事件,您可以在其中检查请求是否真的完成,如果没有重试。

var request = require('request');

function doRequest(location) {
    request({
      timeout: 5000, // five seconds
      url:location
    }, function (error, response, body) {
        console.log("Callback Never Runs. ");
    }).on("complete", function(response) {
      if(!response.complete) setImmediate(function() {
         doRequest(location);
      });
    });
}

doRequest('http://craigslist.org');

您可以进一步扩展,在抛出错误之前只重试 X 次。

- - 原来的 - -

这可能是请求中的错误,因为在这种情况下 craigslist.org 发送所有 302 错误。但是,如果您将 followAllRedirects: true 添加到您的选项中,它会起作用。

var request = require('request');

request({
  followAllRedirects: true,
  url:'http://craigslist.org'
}, function (error, response, body) {
    console.log("Callback Never Runs. ");
});
于 2013-07-26T18:09:56.503 回答
0

如果您包含User-Agent(例如您的浏览器的),它应该可以工作:

request({
    url: 'http://craigslist.com',
    headers: {
        'User-Agent': 'Mozilla/5.0 (...) ...'
    }
}, function (err, res, body) {
    // ...
});

没有它,Craigslist 似乎使连接保持打开状态,因此它不会'end'或不会被调用。'complete'callback

于 2013-07-26T20:09:20.677 回答