2011-12-08 12 views
12

Con Express/Conectar puedo configurar una función de middleware en cualquiera de los formatos:¿Cómo funciona esto? primer argumento opcional que se utiliza en Express (err, req, res, Siguiente) o (req, res, próximos)

function(req, res, next) // first argument will be a request 

O

function(err, req, res, next) // first argument will be an error 

Retrocediendo a partir Express, Connect, tener JavaScript básica: que no entiendo es cómo esto es posible tener una primer argumento opcional?

¿Cómo puedo saber que mi función reconocerá primero un objeto err? Pensé que para hacer esto posible la estructura tendría que ser como la siguiente:

function(req, res, next, err) 

¿Falta algo básico aquí? ¿Es posible consultar cuántos argumentos espera una función?

Edit: gracias por las respuestas a continuación. pero la función de middleware se pasa para expresar, por lo que la variable arguments no es válida. aunque length es correcto ... Creo que lo he descubierto, sería bueno tener confirmación de si este es el caso. Ejemplo a continuación:

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 
+0

siempre estaba preguntando si sería posible o no, entonces me convencí de que no es! –

Respuesta

9

Creo que he descubierto, sería bueno tener la confirmación de si este es el caso

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 

Sí, eso es correcto. La propiedad length de una instancia Function es el número de parámetros formales (argumentos declarados) que tiene. Esto está oculto en Section 13.2 de la especificación, pasos 14 y 15.

Por lo tanto, es bastante fácil para el código llamar a la función comprobar fn.length y pasarle el primer argumento opcional, o no, dependiendo de eso. Esto significa, por supuesto, que es completamente posible escribir una función que podría manejar la versión de cuatro argumentos, pero engaña al marco usando arguments en lugar de parámetros formales. Entonces no harías eso.:-)

(Disculpas por leer mal su pregunta la primera vez.)

+0

* p.s. ¿conoces el nombre de esta técnica? * – Ross

+0

@Ross: Perdón, me perdí ese comentario. No sé si tiene un nombre específico. Has probado el * [arity] (http://en.wikipedia.org/wiki/Arity) * de la función. –

1

expreso pasa mucho tiempo mirando el arity de la función; es decir, cuántos argumentos están ahí:

function foo(err, req, res, next) { 
    if (arguments.length === 3) { // err isn't there 
     next = res; 
     res = req; 
     req = err; 
    } 
    ... 
} 

So. Detecta cuántos argumentos hay, y baraja las variables en consecuencia. Incluso he visto algunos módulos Node.js que hacen automáticamente por ti.

Y aunque no he comprobado recientemente, hubo algunos casos en los que jugar con el arguments -builtin desactivaría todas las optimizaciones en V8.

2

La primera función tiene 3 argumentos, la segunda tiene 4 argumentos, por lo que Express/Connect analiza el número de argumentos.

No se puede cambiar entre argumentos.

Cuestiones relacionadas