Node.js请求返回301重定向

时间:2012-06-16 05:36:16

标签: javascript node.js http nginx http-redirect

我是node.js的新手,但我想玩一些基本代码并提出一些要求。目前,我正在玩OCW搜索(http://www.ocwsearch.com/),我正在尝试使用他们的示例搜索请求提出一些基本请求:

但是,无论我尝试做什么请求(即使我只是查询google.com),它都会让我回头

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/0.7.65</center>
</body>
</html>

我不太确定发生了什么事。我查了一下nginx,但是大多数问题都是由设置自己的服务器的人提出来的。我尝试使用https请求,但返回错误'ENOTFOUND'。

我的代码如下:

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');

    var options = {
      host:'ocwsearch.com',
      path:
      '/api/v1/search.json?q=statistics&contact=http%3a%2f%2fwww.ocwsearch.com%2fabout/',
      method: 'GET'
    }  


    var req = http.request(options, function(res) {
      console.log("statusCode: ", res.statusCode);
      console.log("headers: ", res.headers);
      res.on('data', function(d) {
            process.stdout.write(d);
      });
    });
    req.end();

    req.on('error', function(e) {
      console.error(e);
    });


}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

很抱歉,如果这是一个非常简单的问题,感谢您提供任何帮助!

4 个答案:

答案 0 :(得分:5)

问题是Node.JS的HTTP请求模块没有遵循您给出的重定向。

有关详情,请参阅此问题:How do you follow an HTTP Redirect in Node.js?

基本上,您可以查看标题并自行处理重定向,也可以使用其中一个模块。我已经使用了“请求”库,并且自己也运气好了。 https://github.com/mikeal/request

答案 1 :(得分:2)

var http = require('http');

var find_link = function(link, callback){

  var root =''; 

  var f = function(link){

    http.get(link, function(res) {

      if (res.statusCode == 301) {
        f(res.headers.location);
      } else {
        callback(link);
      } 

    });
 }

  f(link, function(t){i(t,'*')});
}   

find_link('http://somelink.com/mJLsASAK',function(link){
  console.log(link);
});

function i(data){
  console.log( require('util').inspect(data,{depth:null,colors:true}) )
}

答案 2 :(得分:2)

对我来说,我尝试获取GET的网站将我重定向到了安全协议。所以我改变了

require('http');

require('https');

答案 3 :(得分:1)

这个问题现在已经过时了,但我得到了同样的错误,这些答案实际上并没有帮我解决问题。

我写了相同的代码:

t

所以过了一段时间后我意识到这个代码中有一个非常小的错误,它是主机名部分:

var options = {
    hostname: 'google.com',
    port: 80,
    path: '/',
    method: 'GET',
    headers: {
       'Content-Type': 'text/plain',
    }
};

var http = require('http');

var req = http.request(options, function(res) {
    console.log('STATUS:',res.statusCode);
    console.log('HEADERS: ', JSON.stringify(res.headers));
    res.setEncoding('utf8');

    res.on('data', function(chunk) {
        console.log(chunk);
    });
    res.on('end', function() {
        console.log('No more data in response.');
    });
});

req.on('error', function(e) {
    console.log('problem with request: ', e.message);
});
console.log(req);

req.end();

你必须添加&#34; www。&#34;在你的URL之前获取html内容,否则会出现301错误。

 var options = {
     hostname: 'google.com',
     ...