Supongamos que tiene un bloque de código simple como este:
app.get('/', function(req, res){
res.send('Hello World');
});
Esta función tiene dos parámetros req
y res
, que representan los objetos de solicitud y respuesta respectivamente.
Por otro lado, hay otras funciones con un tercer parámetro llamado next
. Por ejemplo, echemos un vistazo al siguiente código:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
No puedo entender de qué next()
sirve o por qué se está utilizando. En ese ejemplo, si la identificación no existe, ¿qué está next
haciendo realmente?
res.send
para completar la solicitud. Si no existe, es probable que haya otro controlador que emita un error y complete la solicitud en ese momento.app.post('/login',function(req,res))
después deapp.get('/users',function(req,res))
que llame al inicio de sesión como la siguiente ruta en el archivo app.js llamando a next ()?app.get("/users")
, se ejecutará si el controlador anterior llama a continuación.Respuestas:
Pasa el control a la siguiente ruta coincidente . En el ejemplo que da, por ejemplo, puede buscar el usuario en la base de datos si
id
se le dio uno y asignarloreq.user
.A continuación, podría tener una ruta como:
Como / users / 123 coincidirá primero con la ruta en su ejemplo, primero comprobará y encontrará el usuario
123
; entonces/users
puede hacer algo con el resultado de eso.Sin embargo, en mi opinión, el middleware de ruta es una herramienta más flexible y poderosa, ya que no se basa en un esquema de URI particular o en un pedido de ruta. Me inclinaría a modelar el ejemplo que se muestra así, suponiendo un
Users
modelo con una sincronizaciónfindOne()
:Ser capaz de controlar el flujo de esta manera es bastante útil. Es posible que desee que ciertas páginas solo estén disponibles para los usuarios con una marca de administrador:
¡Espero que esto te haya inspirado!
fuente
next()
volver a llamar . Sería lo mismo si solo lo usaranext(new Error(…)); return;
.next(new Error(…)); return;
. Si pasamos un valor anext
, se considera unilateralmente un error . No he investigado demasiado el código express, pero busca y encontrarás lo que necesitas :)return next(…);
paranext(…); return;
que sea menos confuso).También tuve problemas para entender next (), pero esto ayudó
fuente
.get
se llame el primero y no el segundo?Antes de comprender
next
, debe tener una pequeña idea del ciclo de Solicitud-Respuesta en el nodo, aunque no mucho en detalle. Comienza con una solicitud HTTP para un recurso en particular y finaliza cuando envía una respuesta al usuario, es decir, cuando encuentra algo como res.send ('Hola Mundo');Echemos un vistazo a un ejemplo muy simple.
Aquí no necesitamos next (), porque resp.send finalizará el ciclo y devolverá el control al middleware de ruta.
Ahora echemos un vistazo a otro ejemplo.
Aquí tenemos 2 funciones de middleware para la misma ruta. Pero siempre obtendrás la respuesta de la primera. Porque eso se monta primero en la pila de middleware y res.send terminará el ciclo.
Pero, ¿y si siempre no queremos el "Hola Mundo!" respuesta de vuelta. Para algunas condiciones podemos querer el "Hola Planeta !!!!" respuesta. Modifiquemos el código anterior y veamos qué sucede.
¿Qué está
next
haciendo aquí? Y sí, podrías tener quejas. Saltará la primera función de middleware si la condición es verdadera e invocará la siguiente función de middleware y obtendrá la"Hello Planet !!!!"
respuesta.Entonces, luego pase el control a la siguiente función en la pila de middleware.
¿Qué sucede si la primera función de middleware no envía ninguna respuesta pero ejecuta una lógica y luego obtiene la respuesta de la segunda función de middleware?
Algo como a continuación: -
En este caso, necesita invocar ambas funciones de middleware. Entonces, la única forma de llegar a la segunda función de middleware es llamando a next ();
fuente
next()
funciona como ungoto
disco duro con una etiqueta? Es decir, en su tercer fragmento, una vez que llamenext()
,res.send("Hello World !!!!");
¿nunca se ejecutará? Me di cuenta de que @Ashe siempre tenía una llamadareturn;
posteriornext
que tenía código en el mismo árbol de ejecución ... Supongo que siempre podía registrarme en express, ¿eh? / corre hacia su editor de texto;)next()
llamada . En este caso, se escribe en la consola, y luego aparece un error, como se llama al segundo , aunque sin éxito. El flujo de código regresa después de la llamada, lo que hace importante a @ Ashe (u otra gestión lógica).past the next() call
Error: Can't set headers after they are sent.
res.send
next()
returns
next()
para omitir la ejecución de las declaraciones restantes. Gracias por señalar eso.Siguiente se usa para pasar el control a la siguiente función de middleware. Si no, la solicitud quedará pendiente o abierta.
fuente
Llamar a esta función invoca la siguiente función de middleware en la aplicación. La función next () no es parte de Node.js o Express API, pero es el tercer argumento que se pasa a la función de middleware. La función next () podría llamarse cualquier cosa, pero por convención siempre se llama "next".
fuente
La ejecución de la
next
función notifica al servidor que ha terminado con este paso de middleware y puede ejecutar el siguiente paso en la cadena.fuente