2012-08-24 28 views
5

我有這在我的節點腳本(簡化了這個問題)屬性名稱:使用以下劃線(「_」)開始

var http = require("http"), 
    url = require("url"), 
    options = url.parse("http://example.com/"), 
    moreOptions = url.parse("http://example.net/"), 
    callback, 
    request, 
    moreDifferentRequest; 

callback = function(res) { 
    console.log(res.socket._httpMessage._headers.host); 
} 

request = http.request(options, callback); 
request.end(); 

moreDifferentRequest = http.request(moreDifferentOptions, callback); 
moreDifferentRequest.end(); 

我從res.socket._httpMessage._headers.host抓住主機名,因爲它不存在在res.headers

但下劃線讓我停下來。他們對我說:「嘿,這只是作爲私人財產對待,僅供socket供內部使用,所以不要閱讀它,因爲它可能會在更高版本中完全改變,我們也不會說您。」

如果我正確地認爲我是這樣做是錯誤的在這裏,在回調中獲取主機名的正確方法是什麼?或者,我只是完全誤解了下劃線,我做的很好?

+3

是的,這正是他們想說什麼。如果可能的話,正確的方法當然是使用公開的,有記錄的API。但是,如果不可能,那麼你必須做到這一點,如果事情破裂,意識到它在你身上。 – Esailija

+0

看看** @ David de Rosier第三點**這裏:http://stackoverflow.com/a/7217209/1601332 //或許給你一些關於它的信息;-)祝你好運! – gmo

回答

3

是的,這正是他們想說的。 如果可能的話,正確的方法當然是公開的,有記錄的API。但是,如果不可能,那麼你必須做到這一點,如果事情破裂,意識到它在你身上。


既然你要發送的請求時,你可以從主機頭:

options.host 

HTTP響應沒有主機頭,它是將主機頭的客戶端(你)在請求中。


隨着包裝函數:

var http = require("http"), 
    opts = require("url").parse("http://stackoverflow.com"); 


function wrapper(options, callback) { 
    return function() { 
     args = [].slice.call(arguments); 
     args.push(options); 
     return callback.apply(this, args); 
    } 
} 

request = http.request(opts, wrapper(opts, function(response, options){ 
    console.log(options.host); 
})); 

request.end(); 
+0

謝謝,這非常有幫助!由於我使用'options'和'moreDifferentOptions'對兩個同時請求使用相同的回調函數,因此我不能只查看'options'。在回調內部,主機確實在'this.agent.sockets'內部顯示爲一個屬性鍵(不是值),因此可以使用,儘管這並不能完全通過氣味測試。但是,比使用我明確警告過的東西更好,但我想。 (我現在看到我在我的問題中輸入錯誤,並沒有使用正確的選項進行第二次調用。修復。) – Trott

+0

@Trott我在包裝函數中編輯。儘管還有很多其他可能的解決方案。既然你是主持人頭銜的送禮者,那麼就不應該有太多的箍jumping跳回來。 :P – Esailija

+0

啊,是的,我覺得無法弄清楚。非常有意義。謝謝! – Trott