2011-03-21 61 views
3

我一直在玩的NodeJS有一段時間了,而且我真的一直在享受它,但是我碰到自己變成一堵牆,但...覆蓋res.write中的NodeJS

我試圖創建一個連接模塊來攔截http.ServerResponse方法。我的最終目標是允許用戶將某種過濾器應用於傳出數據。例如,他們可以選擇在數據發佈之前應用壓縮或其他功能。

雖然我有這個奇怪的錯誤...這個方法被調用兩次,因爲它應該是。

這裏是我的代碼:

var http = require('http'), orig; 

orig = http.ServerResponse.prototype.write; 

function newWrite (chunk) { 
    console.log("Called"); 

    orig.call(this, chunk); 
} 

http.ServerResponse.prototype.write = newWrite; 

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.write("Hello"); 
    res.write(" World"); 
    res.end(); 
    console.log("Done"); 
}).listen(12345); 

這工作,我得到的「Hello World」作爲輸出,當我訪問此使用的瀏覽器,但我得到4「叫」到控制檯,並「完成'輸出兩次。這導致我相信,出於某種原因,我的服務器代碼被調用兩次。我在this.constructor的newWrite方法中做了一個console.log,兩個實例中的構造函數都是ServerResponse,所以這沒什麼幫助。

我真的很困惑這裏發生了什麼。可能會發生什麼?這不會直接影響輸出,但是我可能會同時向多個客戶端提供千兆字節的壓縮數據,而且做任何事情都會給我的服務器帶來不必要的壓力。

這將成爲一個更大的文件服務器的一部分,因此強調不要做任何事情兩次。

編輯:

我已經閱讀過的情況下,這個問題你想知道:

Can I use an http.ServerResponse as a prototype in node.js?

回答

6

沒有與你的代碼沒有問題:如果您在createServer呼叫添加console.log(req.url) ,你可能會看到它實際上被你的瀏覽器調用了兩次。如果在html標記中沒有指定收藏圖標,大多數瀏覽器都會請求所請求的url和額外的/favicon.ico

+1

這使得這麼多的意義!像curl這樣的命令行工具能做到這一點嗎?我不會這麼認爲,因爲他們不使用favicon。我想我不會擔心這在生產中,因爲我有不同的靜態文件代碼路徑比查詢。 – tjameson 2011-03-21 17:54:33

+0

沒有CURL不會,但瀏覽器會請求它們。你可以在你的標記中禁用它們。 – tbranyen 2011-03-21 20:38:51

2

您可以使用連接的圖標中間件來避免這樣的問題:

+0

感謝您的提示。 – tjameson 2011-03-21 17:55:20