我在我的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
内部使用,所以不要读它,因为它可能会在以后的版本中完全改变,我们就是不要告诉你。“
如果我认为我在这里做错了是正确的,那么在回调中获取主机名的正确方法是什么?或者我只是完全误解了下划线以及我正在做的事情很好吗?
答案 0 :(得分: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();