2012-08-24 62 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