2012-08-24 18 views
5

He esto en mi guión Nodo (simplificados para esta pregunta):El uso de nombres de propiedades que comienzan con un guión bajo ("_")

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

que estoy tomando el nombre de host del res.socket._httpMessage._headers.host porque no existe en res.headers.

Pero los guiones bajos me dan una pausa. Me dicen: "Oye, esto debe tratarse como una propiedad privada para uso interno solo por socket, así que no lo leas, porque podría cambiar totalmente en una versión posterior y no vamos a decir tú."

Si estoy en lo cierto al pensar que estoy Haciéndolo mal aquí, ¿cuál es la forma correcta de obtener el nombre de host dentro de la devolución de llamada? ¿O estoy simplemente malinterpretando los guiones bajos y lo que estoy haciendo está bien?

+3

Sí, eso es exactamente lo que están tratando de decir. La forma correcta sería, por supuesto, usar API públicas y documentadas si eso es posible. Pero si no es posible, entonces debes hacer esto y darte cuenta de que está en ti si algo se rompe. – Esailija

+0

Eche un vistazo a ** @ David de Rosier tercer punto ** aquí: http://stackoverflow.com/a/7217209/1601332 // tal vez le dé un poco de luz al respecto ;-) ¡Buena suerte! – gmo

Respuesta

3

Sí, eso es exactamente lo que intentan decir. La forma correcta sería, por supuesto, pública, API documentadas si eso es posible. Pero si no es posible, entonces debes hacer esto y darte cuenta de que está en ti si algo se rompe.


Puesto que usted está enviando la solicitud, se puede obtener el encabezado de host de:

options.host 

respuestas HTTP no tienen un encabezado de host, es el cliente (usted) que envía el encabezado de host en una solicitud


Con función de contenedor:

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

¡Gracias, esto es muy útil! Como estoy usando la misma devolución de llamada para las dos solicitudes simultáneas usando 'options' y' moreDifferentOptions', no puedo simplemente mirar 'options'. Dentro de la devolución de llamada, el host se muestra como una clave de propiedad (no de valor) dentro de 'this.agent.sockets' para que pueda usarse, aunque eso tampoco pasa la prueba de olor. Sin embargo, es mejor que usar cosas de las que estoy explícitamente advertido, imagino. (Ahora veo que escribí errores en mi pregunta y no utilicé las opciones correctas para la segunda llamada. Reparado) – Trott

+0

@Trott He editado en una función de envoltura. Aunque hay muchas otras soluciones posibles. Como usted es el dador del encabezado de host, no debería haber demasiados saltos en el aro para recuperarlo. : P – Esailija

+0

Ah sí, me siento tonto de no ser capaz de resolver eso. Tiene mucho sentido. ¡Gracias! – Trott

Cuestiones relacionadas