2014-03-30 65 views
1

有人可以解釋此代碼來創建代理服務器。除了最後一塊以外,一切都有意義。 request.pipe(代理 - 我不明白,因爲當代理被聲明時,它會發出請求並管理其對客戶端響應的響應。我在這裏丟失了什麼?爲什麼我們需要將原始請求傳送給代理,因爲http.request方法已經使包含在選項VAR請求Node.js - 創建一個代理,爲什麼request.pipe需要?

var http = require('http'); 

function onRequest(request, response) { 
    console.log('serve: ' + request.url); 

    var options = { 
     hostname: 'www.google.com', 
     port: 80, 
     path: request.url, 
     method: 'GET' 
    }; 

    var proxy = http.request(options, function (res) { 
     res.pipe(response, { 
      end: true 
     }); 
    }); 

    request.pipe(proxy, { 
     end: true 
    }); 
} 

http.createServer(onRequest).listen(8888); 

回答

2

我在這裏錯過了什麼? [...] http.request方法已經使請求包含在選項var中。


http.request()實際上並不在其全部發送請求立即:

[...]隨着http.request()必須始終調用req.end()以表示你正在使用的要求做 - 即使沒有數據寫入請求主體。

它創建是開放的,這樣的主體內容,如JSON數據,可以寫入和發送到響應的服務器的http.ClientRequest

var req = http.request(options); 

req.write(JSON.stringify({ 
    // ... 
})); 

req.end(); 

.pipe()是這只是一個選項,當你有一個可讀的流,因爲它會.end() the client request by default


雖然,因爲GET請求很少有一個機構,將需要管道或書面的,通常可以使用http.get()代替,這就要求.end()本身:

由於大多數的請求是沒有GET請求Node提供了這種方便的方法。此方法與http.request()唯一的區別在於它將方法設置爲GET並自動調用req.end()

http.get(options, function (res) { 
    res.pipe(response, { 
     end: true 
    }); 
}); 
0

簡短的回答:。事件循環我不想太遠談了我的屁股,而這正是node.js中得到既美觀又複雜,但請求並不嚴格地在聲明代理的行上MADE:它被添加到事件循環中。因此,當您連接管道時,所有事情都按照它應該的方式工作,從傳入請求傳遞到代理>傳出響應。這是異步代碼的魔法/混亂!

相關問題