2012-06-16 25 views
6

Sono nuovo di zecca su node.js, ma volevo giocare con qualche codice base e fare alcune richieste. Al momento, sto giocando con la ricerca OCW (http://www.ocwsearch.com/), e sto cercando di fare alcune richieste di base usando la loro richiesta di ricerca di esempio:Node.js Richieste di ritorno 301 reindirizzamenti

Tuttavia, non importa quale richiesta cerco di fare (anche se ho appena interrogare google.com), mi

<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> 

sta tornando io non sono troppo sicuro di quello che sta succedendo. Ho cercato nginx, ma la maggior parte delle domande ha chiesto a qualcuno che stava installando i propri server. Ho provato a utilizzare invece una richiesta https, ma questo restituisce un errore "ENOTFOUND".

mio codice qui sotto:

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/'); 

Scusate se questo è davvero semplice domanda, e grazie per tutto l'aiuto che può dare!

+0

Questo è un sacco di $. – Krinkle

risposta

5

Il problema è che il modulo di richiesta HTTP di Node.JS non sta seguendo il reindirizzamento fornito.

Vai a questa domanda per più: How do you follow an HTTP Redirect in Node.js?

In sostanza, è possibile guardare attraverso le intestazioni e gestire il reindirizzamento da soli, o utilizzare uno dei pochi moduli per questo. Ho usato la libreria "request" e ho avuto fortuna con me stesso. https://github.com/mikeal/request

+0

Grazie mille per la rapida risposta! Darò un'occhiata. – dxu

+0

Che succede con gli $ sopra, quelli intenzionali? – jcolebrand

+0

@jcolebrand, Sembra che abbia copiato e incollato dal suo editor. Sembrano indicare caratteri di fine linea. – Brad

3
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})) 
} 
+0

quindi perché dovremmo 'res.statusCode == 301' a questo punto e dov'è' i' e quale obfuscator hai usato per generare questo codice: P –

+0

oh, 'f' è ricorsivo; àla line ~ 12 ... LOL –

+0

Aggiunta la funzione i che sicuramente non lo rende meno confuso .... e per quanto riguarda l'offuscamento wow non ricordo di averlo scritto. Devo essere stato posseduto. – Prospero

1

Questa domanda è vecchia ormai, ma ho ottenuto lo stesso errore 301 e queste risposte non ha in realtà mi aiuta a risolvere il problema.

ho scritto lo stesso codice:

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(); 

così dopo qualche tempo mi sono reso conto che c'è davvero un piccolo errore in questo codice che fa parte hostname:

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

si deve aggiungere "www ". prima del tuo URL per ottenere contenuti HTML, altrimenti ci sarebbe 301 errori.

var options = { 
    hostname: 'www.google.com', 
+1

Una risposta 301 non è un errore, è un reindirizzamento permanente e la base fondamentale della domanda di questa persona. Il sito reindirizzato con una risposta http 301 e node.js http non segue i reindirizzamenti, devi codificarlo o usare uno dei tanti moduli che lo faranno per te. – Brettski