2017-09-08 168 views
2

這應該是非常簡單的,但沒有獲取數據,我得到的是未定義的。Node.JS http獲取請求返回undefined

我背後的代理服務器,我不善於從代理服務器後面發出請求。我發現只有一個教程解釋了在使用代理服務器時不使用外部模塊的http請求,但沒有正確解釋。

const http = require('http'); 
let options = { 
    host: '10.7.0.1', 
    port:8080, 
    path:'www.google.co.uk' 
} 

http.get(options,(res) => { 
    let str = ''; 
    res.setEncoding('utf8'); 
    res.on('data', (chunk) => { 
    str += chunk; 
}) 

res.on('end', (str) => { 
    console.log(str); 
    }) 
}) 

10.7.0.1是代理服務器的地址和8080端口。

此代碼的輸出未定義。

我甚至不知道該方法是否正確,我無法弄清楚。我閱讀節點http文檔,並根據我的理解編寫了選項對象,如果我錯了,請糾正我。

而且一般情況下,如何在使用代理服務器時(不使用任何外部模塊)發出請求。

+0

請看更新,並讓我知道它的工作原理:) @Daksh – turmuka

回答

0

重要

如果你想使用HTTP連接到代理,請看到這一點,你需要使用連接方法

const options = { 
    port: 8080, 
    hostname: '10.7.0.1', 
    method: 'CONNECT', 
    path: 'www.google.com:80' 
    }; 

    const req = http.request(options); 
    req.end(); 

    req.on('connect', (res, socket, head) => { 
console.log('got connected!'); 

socket.write('GET/HTTP/1.1\r\n' + 
      'Host: www.google.com:80\r\n' + 
      'Connection: close\r\n' + 
      '\r\n'); 
socket.on('data', (chunk) => { 
    console.log(chunk.toString()); 
}); 
socket.on('end',() => { 
    proxy.close(); 
} 

附加信息(不需要)

以下是關於如何創建代理併發出請求的完整代碼,我已經找到here。它基本上是創建一個服務器並通過它提出請求。

const http = require('http'); 
const net = require('net'); 
const url = require('url'); 

// Create an HTTP tunneling proxy 
const proxy = http.createServer((req, res) => { 
    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.end('okay'); 
}); 
proxy.on('connect', (req, cltSocket, head) => { 
    // connect to an origin server 
    const srvUrl = url.parse(`http://${req.url}`); 
    const srvSocket = net.connect(srvUrl.port, srvUrl.hostname,() => { 
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' + 
        'Proxy-agent: Node.js-Proxy\r\n' + 
        '\r\n'); 
    srvSocket.write(head); 
    srvSocket.pipe(cltSocket); 
    cltSocket.pipe(srvSocket); 
    }); 
}); 

// now that proxy is running 
proxy.listen(1337, '127.0.0.1',() => { 

    // make a request to a tunneling proxy 
    const options = { 
    port: 1337, 
    hostname: '127.0.0.1', 
    method: 'CONNECT', 
    path: 'www.google.com:80' 
    }; 

    const req = http.request(options); 
    req.end(); 

    req.on('connect', (res, socket, head) => { 
    console.log('got connected!'); 

    // make a request over an HTTP tunnel 
    socket.write('GET/HTTP/1.1\r\n' + 
       'Host: www.google.com:80\r\n' + 
       'Connection: close\r\n' + 
       '\r\n'); 
    socket.on('data', (chunk) => { 
     console.log(chunk.toString()); 
    }); 
    socket.on('end',() => { 
     proxy.close(); 
    }); 
    }); 
}); 

它創建通過http.createServer()一個服務器,然後開始與proxy.listen()聽他們這樣做之後,它連接使用HTTP的connect方法,並在插座一個簡單的GET請求寫道,並將其發送給谷歌,因爲它是指定的路徑。

+0

謝謝,但我有大量的谷歌教程解釋了使用外部模塊的請求,但我想用Node的標準模塊做同樣的事情。 – Daksh

+0

在http模塊的代理之後發出請求,您需要使用該命令設置代理,這就是您要查找的內容嗎? @Daksh – turmuka

+0

我已經在npm中設置了代理。 – Daksh