我一直在玩的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?
這使得這麼多的意義!像curl這樣的命令行工具能做到這一點嗎?我不會這麼認爲,因爲他們不使用favicon。我想我不會擔心這在生產中,因爲我有不同的靜態文件代碼路徑比查詢。 – tjameson 2011-03-21 17:54:33
沒有CURL不會,但瀏覽器會請求它們。你可以在你的標記中禁用它們。 – tbranyen 2011-03-21 20:38:51