使用以下划线(“_”)开头的属性名称

我有我的节点脚本(简化了这个问题):

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 ,所以不要读它,因为它可能会在以后的版本中完全改变,所以我们不会说您。”

如果我正确地认为我在这里做错了,在callback中获取主机名的正确方法是什么? 或者我只是完全曲解下划线,我在做什么是好的?

是的,这正是他们想要说的。 如果可能的话,正确的方法当然是公开的,有logging的API。 但是,如果不可能的话,那么你必须做到这一点,如果有什么事情发生,就意识到这一点。


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

 options.host 

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


使用包装function:

 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();