我的 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
中。
但是下划线让我停顿了一下。他们对我说,“嘿,这将被视为私有(private)属性(property),仅供 socket
内部使用,所以不要阅读它,因为它可能会在以后的版本中完全改变并且我们不会告诉你的。”
如果我认为我在这里做错了是对的,那么在回调中获取主机名的正确方法是什么?还是我完全误解了下划线,而我所做的很好?
最佳答案
是的,这正是他们想要表达的意思。 如果可能的话,正确的方法当然是公开的、记录在案的 API。但如果这不可能,那么您必须这样做,并意识到如果出现问题,责任在您身上。
由于您正在发送请求,因此您可以从以下位置获取主机 header :
options.host
HTTP 响应没有主机 header ,是客户端(您)在请求中发送主机 header 。
包装函数:
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();
关于javascript - 使用以下划线开头的属性名称 ("_"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12114196/