【问题标题】:Using property names that start with an underscore ("_")使用以下划线 ("_") 开头的属性名称
【发布时间】:2012-08-24 17:40:12
【问题描述】:

我的 Node 脚本中有这个(针对这个问题进行了简化):

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 内部使用的私有财产,所以不要阅读它,因为它可能会在以后的版本中完全改变,我们不会去告诉你。”

如果我认为我在这里做错了是对的,那么在回调中获取主机名的正确方法是什么?还是我只是完全误解了下划线而我正在做的事情很好?

【问题讨论】:

  • 是的,这正是他们想说的。如果可能的话,正确的方法当然是使用公开的、记录在案的 API。但如果这不可能,那么你必须这样做,并意识到如果出现问题,它就在你身上。
  • 看看这里的 @David de Rosier 第三点*.com/a/7217209/1601332 // 或许能给你一些启示 ;-) 祝你好运!

标签: javascript node.js


【解决方案1】:

是的,这正是他们想说的。 如果可能的话,正确的方法当然是公开的、记录在案的 API。但如果这不可能,那么你必须这样做,并意识到如果出现问题,它就在你身上。


由于您是发送请求,因此您可以从以下位置获取主机标头:

options.host

HTTP 响应没有主机头,它是客户端(您)在请求中发送主机头。


带包装功能:

var http = require("http"),
    opts = require("url").parse( "http://*.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();

【讨论】:

  • 谢谢,这很有帮助!由于我对使用optionsmoreDifferentOptions 的两个同时请求使用相同的回调,所以我不能只看options。在回调内部,主机确实在this.agent.sockets 中显示为属性键(不是值),因此它可能是可用的,尽管它也没有完全通过气味测试。不过,我想,这比使用我明确警告过的东西要好。 (我现在看到我在问题中打错了字,并且没有为第二次通话使用正确的选项。已修复。)
  • @Trott 我在包装函数中进行了编辑。尽管还有许多其他可能的解决方案。由于您是主机标头的提供者,因此不应进行太多的箍跳来将其取回。 :P
  • 啊,是的,我觉得无法弄清楚这一点很愚蠢。完全有道理。谢谢!
最近更新 更多